Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在UnityContainer中注册类型以使用其他命名注册来解析构造函数参数_C#_Dependency Injection_Unity Container - Fatal编程技术网

C# 在UnityContainer中注册类型以使用其他命名注册来解析构造函数参数

C# 在UnityContainer中注册类型以使用其他命名注册来解析构造函数参数,c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,假设我有一个类,它依赖于接口IFace,并将其他几个依赖项注入构造函数中(如…所示)。我还有两个IFace接口的实现 class Impl1:IFace{} 类Impl2:IFace{} 类别标准:IStd{ Std(IFace impl1,IOtherDependency otherDep,…{…} } 我想将Impl1注册为默认实现,并将Impl2注册为应注入特定类的命名实现 container.RegisterType(); container.RegisterType(“impl2”)

假设我有一个类,它依赖于接口
IFace
,并将其他几个依赖项注入构造函数中(如
所示)。我还有两个
IFace
接口的实现

class Impl1:IFace{}
类Impl2:IFace{}
类别标准:IStd{
Std(IFace impl1,IOtherDependency otherDep,…{…}
}
我想将
Impl1
注册为默认实现,并将
Impl2
注册为应注入特定类的命名实现

container.RegisterType();
container.RegisterType(“impl2”);
这样注册
Std
将注入默认的Impl1实现:

container.RegisterType();//这将注入默认实现Impl1
如何注册
Std
以注入命名的实现,而不必手动调用
Resolve()
?我能想到的最好的办法是:

container.RegisterType(
新的注入构造函数(新的ResolvedParameter(“impl2”),typeof(IOtherDependency,…);
我不喜欢上述方法的地方是,我仍然需要指定所有其他构造函数参数;当签名更改时,我需要调整注册,编译器没有发现问题(抛出运行时异常),并且intellisense在这里不工作

我想要的是大致如下内容:(显然,
InjectNamedType
是虚构的)

container.RegisterType(
InjectNamedType(名称:“impl2”);//这将告诉Unity以该名称注册IFace

以下是您的操作方法:

container.RegisterType<IStd>(
    new InjectionFactory(x =>
        x.Resolve<Std>(new DependencyOverride<IFace>(x.Resolve<IFace>("impl2")))));
container.RegisterType(
新注入工厂(x=>
x、 解析(新的DependencyOverride(x.Resolve(“impl2”;))));
InjectionFactory
允许您指定创建
IStd
对象的工厂逻辑。我们使用
Resolve
方法来解析具体的
Std
类,并使用
DependencyOverride
类来指定要使用的
IFace
实现。我们再次使用
Resolve
方法来解析特定的实现


请注意,工厂逻辑仅在有人试图解析
IStd
(或依赖于
IStd
的类)时运行,而不是在您注册
IStd
时运行,这正是我所需要的。非常感谢。