我有一个接口、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())
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"))));