我正在尝试使用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。
任何想法如何做到这一点?
答案 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"/>
并认为它很好。