Dot-Net
Unity 2.0 通過 XML 註冊泛型類型
我正在嘗試在 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 類型語法。在其他任何地方,您都可以使用通用快捷語法。