通过xml配置已命名的已注册依赖项时的Unity解析问题

时间:2010-12-14 13:40:01

标签: c# .net unity-container ioc-container

我有一个采用泛型类型的接口

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;()重载,它工作正常.. 关于可能发生什么的任何想法,有一个名字这不起作用??

1 个答案:

答案 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”) 我基本上没有意识到标签,但无论如何,这可能对提出同样问题并且不知道解决方案无法自动工作的人有用,以及什么是正确的方法。