Это можно сделать двумя способами:
Вы можете использовать ParameterOverride
и двухэтапный процесс разрешения ...
var tool = container.Resolve<ITool>("ToolB");
var worker = container.Resolve<IWorker>("Worker",
new ParameterOverride("tool", tool));
... при условии, что аргумент конструктора в Worker
, который получает ITool
, называется 'инструментом' (несколько ParameterOverride
экземпляров могут быть переданы в Resolve
). Любые другие зависимости (через конструктор или внедрение свойства), которые имеет именованный экземпляр IWorker
, также должны быть правильно разрешены.
В качестве альтернативы, почему бы не настроить именованные WorkerA, WorkerB, WorkerC
экземпляры, которым требуется указанный ITool
...
container.RegisterType<ITool, ToolA>("ToolA");
container.RegisterType<ITool, ToolB>("ToolB");
container.RegisterType<ITool, ToolC>("ToolC");
container.RegisterType<IWorker, Worker>("WorkerA",
new InjectionConstructor(new ResolvedParameter<ITool>("ToolA")));
container.RegisterType<IWorker, Worker>("WorkerB",
new InjectionConstructor(new ResolvedParameter<ITool>("ToolB")));
container.RegisterType<IWorker, Worker>("WorkerC",
new InjectionConstructor(new ResolvedParameter<ITool>("ToolC")));
Недостаток, который, как я полагаю, связан с последним подходом, заключается в том, что если Worker
принимает дополнительные параметры конструктора, вам нужно будет также указать их для InjectionConstructor
, заданного в том же порядке, что и конструктор, который вы ожидаете использовать в Unity. ..
container.RegisterType<IWorker, Worker>("WorkerA",
new InjectionConstructor(typeof(SomeDependency), new ResolvedParameter<ITool>("ToolA"), typeof(SomeOtherDependency));
Однако Unity будет искать безымянный экземпляр SomeDependency
и SomeOtherDependency
в приведенном выше примере, так что это сэкономит вам немного времени.