有条件地解决Unity中的命名实现

Unity允许您命名同一接口的不同实现,然后按名称解析它们:

var container = new UnityContainer(); // register container.Register("One"); container.Register("Two"); // resolve var twoFish = container.Resolve("Two"); 

现在假设我有一个依赖于IFish并实现ITank的类:

 class Tank : ITank { public Tank(IFish fish) {...} } 

我如何解决ITank并指定要获得哪些IFish实现?

这不起作用:

 container.Register(); var tank = container.Resolve("One"); 

这有效:

 var fish = container.Resolve("One"); var tank = container.Resolve(new DependencyOverride(typeof(IFish), fish); 

但它只处理简单的情况(例如在这个例子中),而不是可能有许多名为“One”的实现的一般情况。 我想要的是能够告诉Unity:

“在解析名为”One“的使用实现时,如果没有这样的实现,则寄存器将回退到未命名的实现”

是否有可以通过此行为插入Unity的自定义解析程序?

您可以使用Unity的InjectionFactory来注入命名实例。

 var container = new UnityContainer(); // register container.Register("One"); container.Register("Two"); container.RegisterType(new InjectionFactory(c=>c.Resolve("One"))); 

如果您现在解析了Tank类型的实例,则会向您的Tank注入OneFish实例。

要处理您想要注入IFish的默认实现的情况,您可以将InjectionFactory更改为以下内容

 new InjectionFactory(c=>{ if (c.IsRegistered("One")) { c.Resolve("One"); } else { c.Resolve("Two"); } })