2010-12-14 31 views
0

我有这需要一个泛型类型通过XML配置与命名注册的依赖时,统一解决问题

interface IIFace<T> 

然后,我有几个实现

public class IFaceImp1 : IIFace<MyObj> {} 
public class IFaceImp2 : IIFace<MyObj> {} 

我定义它被注入到一个视图模型的接口它是此接口的一个特定类型的对象...

public MainViewModel(IIFace<MyObj> scrapper) { } 

,然后我配置统一来填充它

<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> 

这也不起作用...... WH恩试图解决<>(“FirstImplementation”)。但是,如果我删除名称属性并使用Resolve <>()重载,它可以正常工作.. 任何有关可能发生的事情的想法,有名称这不起作用?

+0

我认为问题是当没有名字时,当试图实例化MainViewModel时,Unity会调用容器中的默认注册类型。但是,如果有名称,则无法在注册呼叫中设置该名称。我认为(也许我错了)我需要告诉团结莫名其妙有一个命名的依赖内,但我不知道如何做到这一点 – 2010-12-14 14:04:43

回答

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”) 我基本上不知道标签,但无论如何,这可能会有助于某些人提出相同的问题,并不知道为什么解决方案无法自动工作,什么是正确的做法。