Unity – comment utiliser plusieurs mappages pour le même type et les injecter dans un object

J’utilise Unity 2.0 et dans le code suivant, j’essaye d’injecter un outil spécifique dans l’object Worker.

Je voudrais utiliser le code suivant. Mais il y a bien sûr une erreur “La résolution de la dépendance a échoué”. Je crois que je devrais être capable de faire quelque chose comme ça, mais j’ai du mal à le comprendre.

IUnityContainer container = new UnityContainer(); container.RegisterType("Worker") .RegisterType("ToolA") .RegisterType("ToolB") .RegisterType("ToolC"); IWorker worker = container.Resolve("ToolA"); 

Je sais que cela ne fonctionne pas, mais comment pourrais-je résoudre ce problème?

BarDev

Vous pouvez y parvenir de deux manières:

Vous pouvez utiliser ParameterOverride et un processus de résolution en deux étapes …

 var tool = container.Resolve("ToolB"); var worker = container.Resolve("Worker", new ParameterOverride("tool", tool)); 

… en supposant que l’argument du constructeur de Worker qui reçoit ITool est appelé «outil» (plusieurs instances de ParameterOverride peuvent être passées à Resolve ). Toutes les autres dépendances (via le constructeur ou l’injection de propriété) dont dispose l’instance nommée d’ IWorker doivent également être correctement résolues.

Sinon, pourquoi ne pas configurer les WorkerA, WorkerB, WorkerC nommées WorkerA, WorkerB, WorkerC qui nécessitent l’ ITool spécifié …

 container.RegisterType("ToolA"); container.RegisterType("ToolB"); container.RegisterType("ToolC"); container.RegisterType("WorkerA", new InjectionConstructor(new ResolvedParameter("ToolA"))); container.RegisterType("WorkerB", new InjectionConstructor(new ResolvedParameter("ToolB"))); container.RegisterType("WorkerC", new InjectionConstructor(new ResolvedParameter("ToolC"))); 

L’inconvénient de cette dernière approche est que si Worker utilise des parameters de constructeur supplémentaires, vous devrez également les spécifier dans InjectionConstructor , dans le même ordre que celui du constructeur que Unity devrait utiliser …

 container.RegisterType("WorkerA", new InjectionConstructor(typeof(SomeDependency), new ResolvedParameter("ToolA"), typeof(SomeOtherDependency)); 

Cependant, Unity recherchera l’instance non nommée de SomeDependency et SomeOtherDependency dans l’exemple ci-dessus, de sorte que vous enregistrez un peu de travail.