Unity框架:链式解决方案

时间:2012-10-10 08:36:56

标签: c# dependency-injection unity-container

  

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

我正在尝试使用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。

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

2 个答案:

答案 0 :(得分:2)

如果您使用流利的注册,则可以使用InjectionFactory

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

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

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

答案 1 :(得分:0)

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

有意识地决定以这种方式建造它;有人认为,像这样的连锁注册会让人感到困惑。在示例中很明显,但实际的配置文件有几十种类型,很快就无法发现您实际配置的类型。

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

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

并认为它很好。