我有一个界面IFoo
和三个具体的类:FooA : IFoo
,FooB : IFoo
和MultiFoo : 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())
答案 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"))));