Dot-Net

Unity 2.0 通過 XML 註冊泛型類型

  • May 17, 2011

我正在嘗試在 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。請檢查您的配置文件並驗證此類型名稱。

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

引用自:https://stackoverflow.com/questions/3486837