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
时运行,这正是我所需要的。非常感谢。