在Unity中注册时是否可以指定可变长度的构造函数参数?

时间:2012-11-28 17:10:24

标签: c# unity-container ioc-container params-keyword

我有一个界面IFoo和三个具体的类:FooA : IFooFooB : IFooMultiFoo : IFoo

MultiFoo的构造函数如下所示:

public MultiFoo(params IFoo[] foos) { ... }

在Unity中注册MultiFoo时,是否可以指定特定的分辨率覆盖?我希望能够做到这样的事情:

container.RegisterType<IFoo, FooA>("Foo A");
container.RegisterType<IFoo, FooB>("Foo B");

container.RegisterType<IFoo, MultiFoo>(new ContainerControlledLifetime(),
    new ResolvedOverride<IFoo>("Foo A"),
    new ResolvedOverride<IFoo>("Foo B")
);

然后会在解析时将已解析的 FooA和已解析的FooB传递给构造函数:

new MultiFoo(new FooA(), new FooB())

1 个答案:

答案 0 :(得分:2)

params是编译器语法含糖,你实际上是将一个数组作为单个参数传递。为了匹配你要配置容器,如下所示:

container.RegisterType<IFoo, MultiFoo>(new ContainerControlledLifetimeManager(),
    new InjectionConstructor(new ResolvedArrayParameter<IFoo>(new ResolvedParameter<IFoo>("Foo A"), new ResolvedParameter<IFoo>("Foo B"))));

Resolver覆盖在Resolve时使用,而不是在容器设置时使用。使用resolve覆盖的等价物如下所示:

container.RegisterType<IFoo, MultiFoo>(new ContainerControlledLifetimeManager());

var foo = container.Resolve<IFoo>(
    new ParameterOverride(
        "foos", 
        new ResolvedArrayParameter<IFoo>(new ResolvedParameter<IFoo>("Foo A"), new ResolvedParameter<IFoo>("Foo B"))));