Unity 2.0通过XML注册泛型类型

时间:2010-08-15 09:26:12

标签: .net generics configuration inversion-of-control unity-container

我正在尝试在Unity 2.0的配置文件中注册泛型类型,但似乎无法正确使用它。我在这里指的是MS文档:http://msdn.microsoft.com/en-us/library/ff660933%28v=PandP.20%29.aspx#_Generic_Types

代码如下所示:

public interface IRepository<T> where T : class
{
    ...
}

public class GenericRepository<T> : IRepository<T> where T : class
{
    ...
}

public class BlogRepository : GenericRepository<BlogRepository>
{
    ...
}

我目前拥有的XML配置如下:

<unity>
    <!-- Aliases -->
    <alias alias="BlogIRepository" 
           type="X.Services.Interfaces.IRepository[[X.Domain.Entities.Blog, X.Domain]], X.Services"/>

    <alias alias="BlogRepository" 
           type="X.Repositories.BlogRepository, X.Repositories"/>

    <!-- Type registration -->
    <container name="development">
        <!-- Common connection string value -->
        <instance name="Conn" type="System.String" value="blahblahblah"/>
        <register type="BlogIRepository" mapTo="BlogRepository">
            <constructor>
                <param name="connectionString" type="System.String" dependencyName="Conn"/>
            </constructor>
        </register>
    </container>
</unity>

根据注册泛型类型的文档,您可以在泛型类型周围使用方括号,如果类型不是系统类型,则在更多方括号内提供完全限定类型。我想,这就是我所做的。然而 - 没有工作。

编辑:来自MSDN网站的示例:

<register type="IDictionary[string, [MyApp.Interfaces.ILogger, MyApp]]"/>

产生的错误是:

  

无法解析类型名称或别名IRepository。请检查您的配置文件并验证此类型名称。

3 个答案:

答案 0 :(得分:19)

MSDN没错。我们专门添加了一些快捷方式解析规则,因此在大多数情况下你不必输入所有的's和方括号。

我打了一个看起来和你一样的例子:

public interface IRepository<T> where T: class
{

}

public class GenericRepository<T> : IRepository<T> where T : class
{

}

public class BlogRepository : GenericRepository<Blog>
{

}

public class Blog
{

}

我的XML配置如下所示:

  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <namespace name="UnityConfigExample"/>
    <assembly name="UnityConfigExample"/>

    <container>
      <register type="IRepository[]" mapTo="GenericRepository[]" />
      <register type="IRepository[Blog]" mapTo="BlogRepository" />
    </container>
  </unity>

它只是有效。

您是否有机会尝试使用IRepository的别名而不是命名空间/程序集搜索?我还使用别名来完成以下工作:

  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <alias alias="IRepository" type="UnityConfigExample.IRepository`1, UnityConfigExample" />
    <alias alias="GenericRepository" type="UnityConfigExample.GenericRepository`1, UnityConfigExample"/>
    <alias alias="BlogRepository" type="UnityConfigExample.BlogRepository, UnityConfigExample"/>
    <alias alias="Blog" type="UnityConfigExample.BlogRepository, UnityConfigExample"/>

    <container>
      <register type="IRepository[]" mapTo="GenericRepository[]" />
      <register type="IRepository[Blog]" mapTo="BlogRepository" />
    </container>
  </unity>

指定别名的类型时,必须使用CLR类型语法。在其他任何地方,您都可以使用通用的快捷语法。

答案 1 :(得分:3)

你错过[[之前的'字符(键盘上的Esc下方)

答案 2 :(得分:1)

我认为您需要添加`1,如示例here on MSDN所示:

type="X.Services.Interfaces.IRepository`1[[X.Domain.Entities.Blog, X.Domain]], X.Services"