gpt4 book ai didi

c# - Unity - 如何对同一类型使用多个映射并注入(inject)到一个对象中

转载 作者:太空狗 更新时间:2023-10-30 00:27:43 24 4
gpt4 key购买 nike

我使用的是 Unity 2.0,在下面的代码中,我试图在 Worker 对象中注入(inject)一个特定的工具。

我想使用下面的代码。但是当然有一个错误“解决依赖性失败”。我相信我应该能够做这样的事情,但我很难弄清楚。

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");

我知道这行不通,但我该如何解决这个问题?

酒吧开发

最佳答案

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

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

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

...假设 Worker 上接收 ITool 的构造函数参数称为“工具”(可以传递多个 ParameterOverride 实例到 Resolve)。 IWorker 的命名实例具有的任何其他依赖项(通过构造函数或属性注入(inject))也应正确解析。

或者,为什么不设置需要指定 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 会在上面的示例中查找 SomeDependencySomeOtherDependency 的未命名实例,这样可以节省您一些工作。

关于c# - Unity - 如何对同一类型使用多个映射并注入(inject)到一个对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5440888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com