Unity – 如何将多个映射用于相同类型并注入对象
我正在使用Unity 2.0,在下面的代码中我试图在Worker对象中注入一个特定的工具。
我想使用以下代码。 但是当然有一个错误“依赖的解决方案失败了”。 我相信我应该可以做这样的事情,但我很难搞清楚。
IUnityContainer container = new UnityContainer(); container.RegisterType("Worker") .RegisterType("ToolA") .RegisterType("ToolB") .RegisterType("ToolC"); IWorker worker = container.Resolve("ToolA");
我知道这不起作用,但我该如何解决这个问题呢?
BarDev
有两种方法可以实现这一目标:
您可以使用ParameterOverride
和两步解析过程……
var tool = container.Resolve("ToolB"); var worker = container.Resolve("Worker", new ParameterOverride("tool", tool));
…假设接收ITool
Worker
上的构造函数参数称为“工具”(多个ParameterOverride
实例可以传递给Resolve
)。 应该正确解析IWorker
的命名实例所具有的任何其他依赖项(通过构造函数或属性注入)。
或者,为什么不设置需要指定ITool
名为WorkerA, WorkerB, WorkerC
实例…
container.RegisterType("ToolA"); container.RegisterType("ToolB"); container.RegisterType("ToolC"); container.RegisterType("WorkerA", new InjectionConstructor(new ResolvedParameter("ToolA"))); container.RegisterType("WorkerB", new InjectionConstructor(new ResolvedParameter ("ToolB"))); container.RegisterType("WorkerC", new InjectionConstructor(new ResolvedParameter ("ToolC")));
我认为使用后一种方法的缺点是,如果Worker
需要额外的构造函数参数,您还需要将它们指定给InjectionConstructor
,并按照与您期望Unity使用的构造函数相同的顺序指定…
container.RegisterType("WorkerA", new InjectionConstructor(typeof(SomeDependency), new ResolvedParameter("ToolA"), typeof(SomeOtherDependency));
但是,Unity将在上面的示例中查找SomeDependency
和SomeOtherDependency
的非命名实例,以便为您节省一些工作。