【问题标题】:Unity Framework: Chain up Resolution [duplicate]Unity框架:链接解决方案[重复]
【发布时间】:2012-10-10 08:36:55
【问题描述】:

可能重复:
Is it possible to deduplicate registration in unity?

我正在尝试使用统一 xml 配置建立解析链。 我得到的是这样的:

interface IFoo{}
interface IBar : IFoo{}
class Impl : IBar{}

我使用的配置类似于以下:

<unity xmlns="schemas.microsoft.com/practices/2010/unity">
  <container>
    <register type="IBar" mapTo="Impl"/>
    <register type "IFoo" mapTo="IBar"/>
  </container>
</unity>

当我调用时

unityContainer.Resolve<IFoo>()

我收到一个异常,告诉我无法构建 IBar。 我希望 Unity 在这里重新解析映射类型并返回 Impl。

任何想法如何做到这一点?

【问题讨论】:

  • 这不正确,我不是在寻找重复数据删除。我需要注入/链接!

标签: c# dependency-injection unity-container


【解决方案1】:

如果你使用fluent注册,可以使用InjectionFactory

 container.RegisterType<IBar, Impl>();
 container.RegisterType<IFoo>(new InjectionFactory(c => c.Resolve<IBar>()));

 var foo = container.Resolve<IFoo>();

但是很不幸,xml配置中不存在InjectionFactory,所以必须自己解析xml。

【讨论】:

  • 这是一个开始,但我需要在 xml 中进行...
【解决方案2】:

Unity 不会这样做。您可以编写一个容器扩展来做到这一点;替换重复查找映射直到没有更多映射然后尝试解决最终结果的类型映射策略。

以这种方式构建它是一个有意识的决定;人们认为,像这样链接注册只会让人们感到困惑。在示例中很清楚,但实际的配置文件有几十种类型,很快就无法发现您实际配置的是哪种类型。

所以在你的情况下,我建议只是这样做:

<register type="IFoo" mapTo="Impl"/>

并认为它很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2010-12-11
    • 2011-10-23
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多