3

我有一个接口 ,IFoo和三个具体类:FooA : IFoo,FooB : IFooMultiFoo : IFoo.

for 的构造函数MultiFoo如下所示:

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

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

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())
4

1 回答 1

2

params是编译器语法糖化,您实际上是将数组作为单个参数传递。为了匹配,您将像这样配置容器:

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

解析器覆盖在解析时使用,而不是在容器设置时使用。使用解析覆盖的等效项如下所示:

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"))));
于 2012-11-28T17:35:23.727 回答