0

可能重复:
是否可以统一对注册进行去重?

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

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

4

2 回答 2

2

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

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

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

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

于 2012-10-10T09:14:28.080 回答
0

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

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

因此,在您的情况下,我建议您这样做:

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

并认为它很好。

于 2012-10-10T22:19:22.483 回答