使用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
状态。