有两种方法可以实现这一目标:
您可以使用ParameterOverride
's 和两步解决过程...
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));
SomeDependency
但是,Unity 会在上面的示例中查找and的未命名实例SomeOtherDependency
,这样可以为您节省一些工作。