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.