使用Unity注入数组

我的目标是构造函数注入实现接口的对象数组。

以下是我目前的方式。

Container .RegisterInstance(ParseCompany(args[1]) .RegisterInstance(ParseTargets(args[2])) .RegisterInstance(new ILoader[] { Container.Resolve(), Container.Resolve<PaymentLoader(), Container.Resolve<InvoiceLoader() }); 

以这种方式在容器配置中调用Resolve是典型的,还是有更标准的方法来完成同样的事情?

Unity 本身就能理解数组 ,因此没有理由让它变得如此复杂。 只需注册要包含的ILoaders并正常解析对象图。 自动接线将负责其余部分:

 container.RegisterType("foo"); container.RegisterType("bar"); container.RegisterType("baz"); var c = container.Resolve(); 

假设MyConsumer构造函数定义如下:

 public MyConsumer(ILoader[] loaders) 

但是,您应该知道(出于一些不可思议的原因)Unity仅以这种方式包含命名组件。 默认组件:

 container.RegisterType(); 

不会包含在数组中,因为它没有名称。

如果您有一个稍微复杂的场景,其中不同的值必须在不同的地方使用,那么您可以使用ResolvedArrayParameter,例如

 container.RegisterType("foo"); container.RegisterType("bar"); container.RegisterType("baz"); container.RegisterType("boo"); container.RegisterType("c1", new InjectionConstructor( new ResolvedArrayParameter( new ResolvedParameter("foo"), new ResolvedParameter("bar")))); container.RegisterType("c2", new InjectionConstructor( new ResolvedArrayParameter( new ResolvedParameter("baz"), new ResolvedParameter("boo")))); var c1 = container.Resolve("c1"); var c1 = container.Resolve("c2"); 

在“配置时间”期间使用Resolve是可以接受的并且通常是有用的,并且它对于数组或枚举是完全有效的。

您也可以通过注册ILoader[]类型并使用名称的RegisterType重载注册每个特定的ILoader类型来完成上述操作。

然后,无论何处需要ILoader[] (例如需要注入),上述所有内容都将在配置时间后为您解决。 当然,如果你需要多个/不同的ILoader[]那么它会在配置时间内回到需要使用Resolve状态。