Csharp/C#教程:有条件地解决Unity中的命名实现分享


有条件地解决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更改为以下内容

上述就是C#学习教程:有条件地解决Unity中的命名实现分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

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

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1033857.html

(0)
上一篇 2022年1月18日
下一篇 2022年1月18日

精彩推荐