用Unity注入数组
本文关键字:数组 注入 Unity | 更新日期: 2023-09-27 18:15:02
我的目标是构造器注入一个实现接口的对象数组。
以下是我目前的方式。
Container
.RegisterInstance<Company>(ParseCompany(args[1])
.RegisterInstance<eTargets>(ParseTargets(args[2]))
.RegisterInstance<ILoader[]>(new ILoader[] {
Container.Resolve<CustomerLoader>(),
Container.Resolve<PaymentLoader(),
Container.Resolve<InvoiceLoader()
});
在容器配置中以这种方式调用Resolve是典型的吗?还是有更标准的方式来完成相同的事情?
Unity 本身理解数组,所以没有理由把它弄得这么复杂。只需注册您想要包含的ILoaders
并正常解析对象图。自动连接将处理其余部分:
container.RegisterType<ILoader, FooLoader>("foo");
container.RegisterType<ILoader, BarLoader>("bar");
container.RegisterType<ILoader, BazLoader>("baz");
var c = container.Resolve<MyConsumer>();
假设MyConsumer
构造函数是这样定义的:
public MyConsumer(ILoader[] loaders)
然而,你应该意识到(出于某些不可思议的原因)Unity只以这种方式包含命名的组件。默认组件:
container.RegisterType<ILoader, Loader>();
将不包含在数组中,因为它没有名称。
如果你有一个稍微复杂的场景,不同的值数组必须在不同的地方使用,那么你可以使用ResolvedArrayParameter,例如
container.RegisterType<ILoader, FooLoader>("foo");
container.RegisterType<ILoader, BarLoader>("bar");
container.RegisterType<ILoader, BazLoader>("baz");
container.RegisterType<ILoader, BooLoader>("boo");
container.RegisterType<IConsumer, MyConsumer>("c1",
new InjectionConstructor(
new ResolvedArrayParameter<ILoader>(
new ResolvedParameter<ILoader>("foo"),
new ResolvedParameter<ILoader>("bar"))));
container.RegisterType<IConsumer, MyConsumer>("c2",
new InjectionConstructor(
new ResolvedArrayParameter<ILoader>(
new ResolvedParameter<ILoader>("baz"),
new ResolvedParameter<ILoader>("boo"))));
var c1 = container.Resolve<MyConsumer>("c1");
var c1 = container.Resolve<MyConsumer>("c2");
在"配置时间"期间使用Resolve
是可以接受的,并且通常是有用的,它对于数组或枚举对象是完全有效的。
您也可以通过注册ILoader[]
类型并使用接受名称的RegisterType
重载注册每个特定的ILoader
类型来完成上述操作。
然后,只要需要ILoader[]
(例如需要注入),上述所有问题都会在配置后为您解决。当然,如果您需要多个/不同的ILoader[]
,那么在配置时就需要使用Resolve
。