代码之家  ›  专栏  ›  技术社区  ›  krisg

Unity 2.0通过XML注册泛型类型

  •  10
  • krisg  · 技术社区  · 16 年前

    我正在尝试在Unity2.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 回复  |  直到 15 年前
        1
  •  19
  •   Chris Tavares    16 年前

    MSDN没有错。我们特别添加了一些快捷方式解析规则,以便在大多数情况下不必输入所有的`'和方括号。

    我举了一个很像你的例子:

    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类型语法。在其他任何地方,您都可以使用通用快捷方式语法。

        2
  •  3
  •   Krzysztof Kozmic    16 年前

    [[ (在我键盘上的Esc下方)

        3
  •  1
  •   dahlbyk    16 年前

    here on MSDN 建议:

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