4

我正在使用 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");

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

巴德开发

4

1 回答 1

9

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

您可以使用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,这样可以为您节省一些工作。

于 2011-03-26T07:28:33.820 回答