L'Injection de dépendance - Quand utiliser la propriété d'injection
J'ai une classe qui dispose d'un constructeur comme ceci:
private string _someString;
private ObjectA _objectA;
private ObjectB _objectB;
private Dictionary<Enum, long?> _dictionaryA;
private Dictionary<Tuple<Enum,long?>, long?> _dictionaryB;
public SomeDiClass(string someString)
{
_someString = someString;
_objectA = new ObjectA();
_objectB = new ObjectB();
_dictionaryA = new Dictionary<Enum, long?>();
_dictionaryB = new Dictionary<Tuple<Enum, long?>, long?>();
}
Je veux obtenir la dépendance de la création de ce constructeur. Dans un premier temps, je voudrais déplacer le ObjectA et B de la dépendance pour les constructeurs paramètres de les injecter via le constructeur de l'injection. Je voudrais utiliser un conteneur IoC à cette fin, c'est là que je suis bloqué pour le moment. La question est de savoir quoi avec someString et les dictionnaires. J'ai besoin de les injecter à la classe, parce que le contenu des dictionnaires sera une partie importante de tests unitaires.
Serait-ce une bonne idée d'injecter de la chaîne et les dictionnaires via la propriété d'injection (je n'ai pas besoin d'eux dans d'autres classes), donc je me retrouver avec quelque chose comme ça?:
private ObjectA _objectA;
private ObjectB _objectB;
public string SomeString { get; set; }
public Dictionary<Enum, long?> DictionaryA { get; set; }
public Dictionary<Tuple<Enum, long?>, long?> DictionaryB { get; set; }
public SomeDiClass(ObjectA objectA, ObjectB objectB)
{
_objectA = objectA;
_objectB = objectB;
}
Est la meilleure pratique pour résoudre quelque chose comme cela?
- quand vous dites cio? parlez-vous de printemps, framework java? ou autre chose? ty.
- En général. Le projet actuel est en C#, donc je me retrouver avec quelque chose comme de l'Unité.
Vous devez vous connecter pour publier un commentaire.
L'Injection de dépendance n'est pas un but, mais une solution à un ensemble particulier de problèmes. Par exemple, l'Injection de Dépendance rend facile à remplacer abstractions pour le test unitaire et permet à votre application plus flexible, puisque vous pouvez échanger, de décorer et d'intercepter les dépendances sans la classe de consommateurs de savoir.
Cela ne signifie pas que vous devez injecter chaque dépendance d'une classe a, depuis, il se doit de vous aider dans la prise de la classe la plus testable, et le système plus facile à gérer. Ainsi, vous devez vous demander si cela est utile à partir d'un point de vue test d'injecter ces dictionnaires à partir de l'extérieur ou si elle contribue à rendre votre application plus souple.
Cette dernière question est difficile à répondre pour moi, étant donné que votre question n'a pas assez de détail. Mais voici quelques conseils:
Les seules choses que vous souhaitez généralement les injecter dans une classe sont les services et les valeurs de configuration.
Un service est un contrat/abstraction/interface qui fournit 'a service". Cela signifie généralement que le service sera de faire quelque chose en votre nom, comme le calcul des prix, de communiquer à la base de données en cache les valeurs, le système retourne de temps, de formater votre disque dur 🙂
Une valeur de configuration est ce que c'est; juste une valeur. Mais vous avez besoin pour l'injecter, car il ne peut pas être codé en dur dans la classe, et vous ne voulez pas la classe pour aller chercher la valeur de la
ConfigurationManager
par exemple, parce que ce serait de créer une dépendance cachée (sur laConfigurationmanager
) et cela permettrait de rendre la classe plus difficile à tester.D'autres choses, comme primitives, les messages, les Dto, les types de collection et des entités, et de tout ce qui n'est pas de fournir tout service (logique) et n'est pas dans la voie de l'unité de test ne doit pas être abstraite et donc n'a pas à être injecté. Dans votre cas, les dictionnaires, et une partie de l'état interne de l'
SomeDiClass
de la classe, pas un service que votre classe dépend.Si, d'autre part, ces dictionnaires sont réutilisés par d'autres services, ces dictionnaires devra être injecté. Mais vous ne voulez jamais à injecter un tel dictionnaire lui-même directement, depuis le dictionnaire lui-même n'est pas de service. Au lieu de cela, vous devez créer une abstraction autour d'eux, quelque chose qui cache les détails de ce dictionnaire et fournit à la demande un service autour d'elle.
Dependency Injection is not a goal, but a solution to a particular set of problems
je pense que le reste va approfondir sur le sujet 😉Vous devez utiliser la propriété d'injection (ou injection par mutateur) lors de la création de l'objet de votre type est hors de votre contrôle. Comme la Page aspx, HttpHandler, ApiController etc. Pour toutes les autres situations, il est recommandé d'utiliser le constructeur de l'injection.
À résoudre des dépendances pour la Page aspx en utilisant StructureMap, j'ai utiliser l'approche suivante.
Tout d'abord, j'ai créer un BasePage de la classe et de l'utilisation de StructureMap l'Accumulation du() dans le constructeur de résoudre les dépendances de la dérivée pages. Le Code est donné ci-dessous: