2017-10-09 63 views
1

我想如下注册我的通用仓库的所有实现:登记 - 类型参数不匹配

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

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

附加信息:配置无效。为类型IErrorLogService创建 实例失败。类型为 的构造函数ErrorLogService包含名称为'errorLogRepository' 和类型IRepository < ErrorLog>的未注册参数。请确保 IR知识库< ErrorLog>已注册,或者更改 ErrorLogService的构造函数。请注意,存在不同的 类型的注册类型Persistence.Interfaces.Repository.Generic.IRepository < T>,而 请求的类型为 Persistence.Interfaces.Repository.Generic.IRepository < Persistence.DataModel.ErrorLog>。

根据various SO threads,上面的代码段应该是要走的路。我错过了什么?

我的仓储类:

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

IRepositoryRepository存在于同一装配。

每种类型的显式注册工作:

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

请提供您的问题链接到各种SO线程。 – Enigmativity

+0

@Steven对不起,我的更新有帮助吗? – Johan

回答

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找到更多这方面的信息。