用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注入数组

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