我有一个接口(interface) 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"))));
关于c# - 在 Unity 中注册时是否可以指定可变长度的构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13610631/