有两种方法可以实现:
您可以使用ParameterOverride 和两步解决过程...
var tool = container.Resolve<ITool>("ToolB");
var worker = container.Resolve<IWorker>("Worker",
new ParameterOverride("tool", tool));
...假设接收ITool 的Worker 上的构造函数参数称为“工具”(可以将多个ParameterOverride 实例传递给Resolve)。 IWorker 的命名实例所具有的任何其他依赖项(通过构造函数或属性注入)也应正确解析。
另外,为什么不设置需要指定 ITool 的名为 WorkerA, WorkerB, WorkerC 的实例...
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 的未命名实例,这样可以为您节省一些工作。