我试图注册我的通用存储库的所有实现,如下所示:
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 { }
IRepository
和Repository
存在于同一个程序集中。
每种类型的显式注册都有效:
container.Register<IRepository<ErrorLog>, Repository<ErrorLog>>();
答案 0 :(得分:1)
您在其文档中使用状态的Register(Type openGenericServiceType, IEnumerable<Assembly> assemblies)
重载:
在给定
assemblies
的给定openGenericServiceType
集合中注册所有具体的,非泛型,公共和内部类型,并使用容器的默认生活方式(通过默认值)。
请注意这里的“非通用”一词。此寄存器重载旨在批量注册开放式通用服务类型的所有非泛型实现。由于您有一个开放式通用实现,因此Register
方法无法找到它。
相反,您应该使用Register(Type serviceType, Type implementationType)
重载,其中指出:
注册每次请求
serviceType
时都会返回一个新实例。如果serviceType
和implementationType
表示相同的类型,则类型将自行注册。 支持开放和封闭的通用类型。
TLDR;
将注册更改为以下内容:
container.Register(typeof(IRepository<>), typeof(Repository<>));
中找到有关此内容的更多信息