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

标签 c# unity-container ioc-container params-keyword

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

关于c# - 在 Unity 中注册时是否可以指定可变长度的构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13610631/

相关文章:

c# - 为 C# 包装 C++ CLI 类

c# - 如何将 Func<T, object> 转换为 Func<dynamic, object>?

c# - 我应该完全申报一次性元素吗?

c# - 使用 Unity 将对象注入(inject) IValueConverter 实例

asp.net-mvc - 无法加载文件或程序集 System.Web.WebPages.Razor、Version=3.0.0.0 或其依赖项之一

c# - 如何结合 BindBase() 和 BindAllInterfaces()?

c# - vb.net 人工作用域

unity-container - 使用 Unity 拦截子方法调用

c# - 返回抽象泛型类型的适当具体类型

c# - 如何使用简单注入(inject)器模拟模块/安装程序/注册表