簡體   English   中英

注冊開放泛型類型 - 類型參數不匹配

[英]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 { }

IRepositoryRepository存在於同一個程序集中。

每種類型的顯式注冊都有效:

container.Register<IRepository<ErrorLog>, Repository<ErrorLog>>();

您在其文檔中使用狀態的Register(Type openGenericServiceType, IEnumerable<Assembly> assemblies)重載:

在給定的assemblies集中注冊所有具體的、非泛型的、公共的和內部類型,這些assemblies使用容器的默認生活方式(默認情況下是瞬態的)實現給定的openGenericServiceType

請注意此處的“非通用”一詞。 此注冊重載旨在批量注冊開放通用服務類型的所有非通用實現。 由於您有一個開放的通用實現,因此該Register方法將找不到它。

相反,您應該使用Register(Type serviceType, Type implementationType)重載,它指出:

注冊每次請求serviceType時將返回的新實例。 如果serviceTypeimplementationType表示相同的類型,則該類型自行注冊。 支持開放和封閉的泛型類型。

TLDR;

將您的注冊更改為以下內容:

container.Register(typeof(IRepository<>), typeof(Repository<>));

您可以在Simple Injector 的文檔中找到更多相關信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM