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

时间:2011-03-26 07:06:31

标签: c# dependency-injection unity-container ioc-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");

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

BarDev

1 个答案:

答案 0 :(得分:9)

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

您可以使用ParameterOverride和两步解决过程......

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

...假设接收Worker的{​​{1}}上的构造函数参数称为“工具”(多个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的非命名实例,这样可以为您节省一些工作。