Eli*_*nti 7 c# unity-container
Unity允许您命名同一接口的不同实现,然后按名称解析它们:
var container = new UnityContainer();
// register
container.Register<IFish, OneFish>("One");
container.Register<IFish, TwoFish>("Two");
// resolve
var twoFish = container.Resolve("Two");
Run Code Online (Sandbox Code Playgroud)
现在假设我有一个依赖于IFish并实现ITank的类:
class Tank : ITank
{
public Tank(IFish fish) {...}
}
Run Code Online (Sandbox Code Playgroud)
我如何解决ITank并指定要获得哪些IFish实现?
这不起作用:
container.Register<ITank, Tank>();
var tank = container.Resolve<ITank>("One");
Run Code Online (Sandbox Code Playgroud)
这有效:
var fish = container.Resolve<IFish>("One");
var tank = container.Resolve<Tank>(new DependencyOverride(typeof(IFish), fish);
Run Code Online (Sandbox Code Playgroud)
但它只处理简单的情况(例如在这个例子中)而不是可能有许多名为"One"的实现的一般情况.我想要的是能够告诉Unity:
"当解析名为"One"的使用实现时,如果没有这样的实现,则寄存器将回退到未命名的实现"
是否有可以通过此行为插入Unity的自定义解析程序?
您可以使用 Unity 的 InjectionFactory 来注入命名实例。
var container = new UnityContainer();
// register
container.Register<IFish, OneFish>("One");
container.Register<IFish, TwoFish>("Two");
container.RegisterType<ITank,Tank>(new InjectionFactory(c=>c.Resolve<IFish>("One")));
Run Code Online (Sandbox Code Playgroud)
如果您现在解析 Tank 类型的实例,OneFish 的实例将注入您的 Tank。
要处理您想要注入 IFish 的默认实现的情况,您可以将 InjectionFactory 更改为以下内容
new InjectionFactory(c=>{
if (c.IsRegistered<IFish>("One")) {
c.Resolve<IFish>("One");
}
else {
c.Resolve<IFish>("Two");
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3696 次 |
| 最近记录: |