[英]Registration of open generic types - type parameter mismatch
我正在嘗試按如下方式注冊我的通用存儲庫的所有實現:
container.Register(typeof(IRepository<>), new[] { typeof(Repository<>).Assembly });
但是,容器無法驗證我的配置:
附加信息:配置無效。 為類型 IErrorLogService 創建實例失敗。 ErrorLogService 類型的構造函數包含名稱為“errorLogRepository”且類型為 IRepository<ErrorLog> 的未注冊參數。 請確保 IRepository<ErrorLog> 已注冊,或更改 ErrorLogService 的構造函數。 請注意,存在不同類型 Persistence.Interfaces.Repository.Generic.IRepository<T> 的注冊,而請求的類型為 Persistence.Interfaces.Repository.Generic.IRepository<Persistence.DataModel.ErrorLog>。
基於各種 SO 線程,上面的代碼片段應該是要走的路。 我錯過了什么?
我的存儲庫類:
public class Repository<T> : IRepository<T> where T : Entity { }
IRepository
和Repository
存在於同一個程序集中。
每種類型的顯式注冊都有效:
container.Register<IRepository<ErrorLog>, Repository<ErrorLog>>();
您在其文檔中使用狀態的Register(Type openGenericServiceType, IEnumerable<Assembly> assemblies)
重載:
在給定的
assemblies
集中注冊所有具體的、非泛型的、公共的和內部類型,這些assemblies
使用容器的默認生活方式(默認情況下是瞬態的)實現給定的openGenericServiceType
。
請注意此處的“非通用”一詞。 此注冊重載旨在批量注冊開放通用服務類型的所有非通用實現。 由於您有一個開放的通用實現,因此該Register
方法將找不到它。
相反,您應該使用Register(Type serviceType, Type implementationType)
重載,它指出:
注冊每次請求
serviceType
時將返回的新實例。 如果serviceType
和implementationType
表示相同的類型,則該類型自行注冊。 支持開放和封閉的泛型類型。
TLDR;
將您的注冊更改為以下內容:
container.Register(typeof(IRepository<>), typeof(Repository<>));
您可以在Simple Injector 的文檔中找到更多相關信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.