注册开放泛型类型 - 类型参数不匹配

时间:2017-10-09 05:31:14

标签: c# simple-injector

我试图注册我的通用存储库的所有实现,如下所示:

container.Register(typeof(IRepository<>), new[] { typeof(Repository<>).Assembly });

但是,容器无法验证我的配置:

  

其他信息:配置无效。创造   类型IErrorLogService的实例失败。类型的构造函数   ErrorLogService包含名称为&#39; errorLogRepository&#39;的参数。   并键入IRepository&lt; ErrorLog&gt;那是没有注册的。请确保   IRepository&LT;错误日志&GT;已注册,或更改的构造函数   ErrorLogService。请注意,存在不同的注册   类型Persistence.Interfaces.Repository.Generic.IRepository&lt; T&gt;而   请求的类型是   Persistence.Interfaces.Repository.Generic.IRepository&LT; Persistence.DataModel.ErrorLog&GT;

根据various SO threads,上面的代码段应该是可行的方法。我错过了什么?

我的存储库类:

public class Repository<T> : IRepository<T> where T : Entity { }

IRepositoryRepository存在于同一个程序集中。

每种类型的显式注册都有效:

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

1 个答案:

答案 0 :(得分:1)

您在其文档中使用状态的Register(Type openGenericServiceType, IEnumerable<Assembly> assemblies)重载:

  

在给定assemblies的给定openGenericServiceType集合中注册所有具体的,非泛型,公共和内部类型,并使用容器的默认生活方式(通过默认值)。

请注意这里的“非通用”一词。此寄存器重载旨在批量注册开放式通用服务类型的所有非泛型实现。由于您有一个开放式通用实现,因此Register方法无法找到它。

相反,您应该使用Register(Type serviceType, Type implementationType)重载,其中指出:

  

注册每次请求serviceType时都会返回一个新实例。如果serviceTypeimplementationType表示相同的类型,则类型将自行注册。 支持开放和封闭的通用类型。

TLDR;

将注册更改为以下内容:

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

您可以在Simple Injector's documentation

中找到有关此内容的更多信息