我有一个采用泛型类型的接口
interface IIFace<T>
然后我有几个实现
public class IFaceImp1 : IIFace<MyObj> {}
public class IFaceImp2 : IIFace<MyObj> {}
我定义了一个viewmodel,它将特定类型的接口注入其中...
public MainViewModel(IIFace<MyObj> scrapper) { }
然后我配置Unity来填充它
<containers>
<container>
<register type="IIFace[MyObj]" mapTo="IFaceImp1">
<constructor>
<param name="loc" value="i am just a mock">
</param>
</constructor>
</register>
</container>
</containers>
这很好用 问题是,现在我想创建命名注册,以便稍后我可以通过名称解析它们...所以我命名它,并首先创建另一个,但是没有用。我把问题解决了:
<containers>
<container>
<register type="IIFace[MyObj]" mapTo="IFaceImp1" name="FirstImplementation">
<constructor>
<param name="loc" value="i am just a mock">
</param>
</constructor>
</register>
</container>
</containers>
哪个也行不通......试图解析&lt;&gt;(“FirstImplementation”)。但是,如果我删除name属性并使用Resolve&lt;&gt;()重载,它工作正常.. 关于可能发生什么的任何想法,有一个名字这不起作用??
答案 0 :(得分:0)
好的,我发现了问题所在 我需要使用标签,在xml中构建我的对象模型 最终结果与此类似:
<containers>
<container>
<register type="ViewModelBase" mapTo="MainViewModel" name="MockMainViewModel">
<constructor>
<param name="imp">
<dependency name="FirstImplementation" />
</param>
</constructor>
</register>
<register type="IIFace[MyObj]" mapTo="IFaceImp1" name="FirstImplementation">
<constructor>
<param name="loc" value="i am just a mock">
</param>
</constructor>
</register>
</container>
</containers>
这样,这个配置告诉Unity,当使用Resolve(“MockMainViewModel”)调用时,实例化它,并解析(通过依赖)其构造函数中需要的参数,具有指定的名称(“FirstImplementation”) 我基本上没有意识到标签,但无论如何,这可能对提出同样问题并且不知道解决方案无法自动工作的人有用,以及什么是正确的方法。