7

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

var container = new UnityContainer();

// register
container.Register<IFish, OneFish>("One");
container.Register<IFish, TwoFish>("Two");

// resolve
var twoFish = container.Resolve("Two");

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

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

如何解决 ITank 并指定要获取的 IFish 实现?

这不起作用:

container.Register<ITank, Tank>();

var tank = container.Resolve<ITank>("One");

这有效:

var fish = container.Resolve<IFish>("One");

var tank = container.Resolve<Tank>(new DependencyOverride(typeof(IFish), fish);

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

“在解析名为“One”的使用实现时,如果没有这样的实现被注册回退到未命名的实现”

是否有可以通过这种行为插入 Unity 的自定义解析器?

4

1 回答 1

4

您可以使用 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")));

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

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

new InjectionFactory(c=>{
  if (c.IsRegistered<IFish>("One")) {
    c.Resolve<IFish>("One");
  }
  else {
    c.Resolve<IFish>("Two");
  }
})
于 2013-10-04T05:58:33.737 回答