可能的重复项:
是否可以在统一中删除重复的注册?
我正在尝试使用 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"/>
并认为它很好。