在 Unity 中注册时是否可以指定可变长度构造函数参数



我有一个接口、IFoo和三个具体的类:FooA : IFooFooB : IFooMultiFoo : 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"))));

相关内容

  • 没有找到相关文章

最新更新