[英]Is it possible to specify variable-length constructor arguments when registering in Unity?
我有一个接口, 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"))));
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"))));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.