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。

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

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

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

但不幸的是,InjectionFactory在 xml 配置中不存在,因此您必须自己解析 xml。

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

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

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

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

并认为它很好。

最新更新