我无法找到使用简单注入(inject)器 (v3) 注册通用存储库的方法。
我有一个基类GenericRepository<T>
和一个接口(interface)ILinkRepository
。基类和接口(interface)都实现 IGenericRepository<T>
。我的存储库实现,LinkRepository
,继承GenericRepository<T>
并实现ILinkRepository
.
然后我有一个服务类,它通过构造函数获取存储库 LinkService(ILinkRepository repository)
.
我想通过简单注入(inject)器自动注册我的通用存储库,所以我尝试了这个:
container.Register(typeof(IGenericRepository<>), new []
{
typeof(IGenericRepository<>).Assembly
});
当 Simple Injector 尝试验证我的容器时,我收到错误:
The constructor of type LinkService contains the parameter with name 'repository' and type ILinkRepository that is not registered. Please ensure ILinkRepository is registered...
那么有没有其他方法可以告诉 Simple Injector ILinkRepository 是一个 LinkRepository 实例,而无需像下面那样直接注册它?
container.Register<ILinkRepository, LinkRepository>()
最佳答案
Simple Injector 的批量注册功能主要集中在通用接口(interface)上的注册。 ILinkRepository
是一个非通用接口(interface),具有到非通用实现的一对一映射。
如果要批量注册这些类型的非泛型抽象,则必须自己编写一个 LINQ 查询来反射(reflect)程序集并获取类型并循环查询以注册这些类型。没什么花哨的,也没什么复杂的。该文档甚至显示 some examples的这个。
但是 Simple Injector 无法帮助您解决此问题是有原因的。至少可以说,具有此类非通用存储库接口(interface)和基类的设计很尴尬,如 this article describes ,这样的设计违反了五分之三的 SOLID 原则,这表明从可维护性的角度来看它可能不是最好的设计。
所以我的建议是仅使用通用存储库接口(interface)(可能具有非通用实现)并将任何实体特定操作移至其自己的抽象中,例如 this article以及之前引用的文章中的描述。
关于c# - 使用简单注入(inject)器自动注册通用存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34867950/