Unity - 如何将多个映射用于相同类型并注入对象

Mik*_*Dev 4 c# dependency-injection ioc-container unity-container unity2.0

我正在使用Unity 2.0,在下面的代码中我试图在Worker对象中注入一个特定的工具.

我想使用以下代码.但是当然有一个错误"依赖的解决方案失败了".我相信我应该可以做这样的事情,但我很难搞清楚.

IUnityContainer container = new UnityContainer();
container.RegisterType<IWorker, Worker>("Worker")
    .RegisterType<ITool, ToolA>("ToolA")
    .RegisterType<ITool, ToolB>("ToolB")
    .RegisterType<ITool, ToolC>("ToolC");

IWorker worker = container.Resolve<Worker>("ToolA");
Run Code Online (Sandbox Code Playgroud)

我知道这不起作用,但我如何解决这个问题?

BarDev

Jam*_*ter 9

有两种方法可以实现这一目标:

你可以使用ParameterOverride's和两步解决过程......

var tool = container.Resolve<ITool>("ToolB");
var worker = container.Resolve<IWorker>("Worker", 
    new ParameterOverride("tool", tool));
Run Code Online (Sandbox Code Playgroud)

...假设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")));
Run Code Online (Sandbox Code Playgroud)

我认为使用后一种方法的缺点是,如果Worker需要额外的构造函数参数,您还需要将它们指定给它们,以与InjectionConstructor您期望Unity使用的构造函数相同的顺序指定...

container.RegisterType<IWorker, Worker>("WorkerA", 
    new InjectionConstructor(typeof(SomeDependency), new ResolvedParameter<ITool>("ToolA"), typeof(SomeOtherDependency));
Run Code Online (Sandbox Code Playgroud)

然而,统一将查找的非命名实例SomeDependency,并SomeOtherDependency在上面的例子中,这样可以节省一些工作.