Den*_*oli 2 c# generics dependency-injection simple-injector
我找不到使用 Simple Injector (v3) 注册通用存储库的方法。
我有一个基类GenericRepository<T>和一个接口ILinkRepository。基类和接口都实现IGenericRepository<T>. 我对存储库的实现LinkRepository继承GenericRepository<T>并实现了ILinkRepository.
然后我有一个服务类,它通过构造函数获取存储库LinkService(ILinkRepository repository)。
我想通过 Simple Injector 自动注册我的通用存储库,所以我试过这个:
container.Register(typeof(IGenericRepository<>), new []
{
typeof(IGenericRepository<>).Assembly
});
Run Code Online (Sandbox Code Playgroud)
当 Simple Injector 尝试验证我的容器时,出现错误:
LinkService 类型的构造函数包含名称为“repository”且类型为 ILinkRepository 的未注册参数。请确保 ILinkRepository 已注册...
那么有没有其他方法可以告诉 Simple Injector ILinkRepository 是一个 LinkRepository 实例而无需像下面那样直接注册它?
container.Register<ILinkRepository, LinkRepository>()
Run Code Online (Sandbox Code Playgroud)
Simple Injector 的批量注册工具主要关注通用接口上的注册。这ILinkRepository是一个非泛型接口,具有到非泛型实现的一对一映射。
如果要批量注册这些类型的非通用抽象,则必须自己编写一个 LINQ 查询来反映程序集并获取类型并循环查询以注册这些类型。没有什么花哨的,也没有什么复杂的。该文档甚至显示了一些示例。
但是,Simple Injector 不能帮助您解决这个问题是有原因的。具有这种与基类的非通用存储库接口的设计至少可以说很尴尬,而且正如本文所述,这种设计违反了五项 SOLID 原则中的三项,这表明它可能不是可维护性的最佳设计看法。
所以我的建议是只使用通用存储库接口(可能带有非通用实现)并将任何特定于实体的操作移动到它自己的抽象中,如本文和之前引用的文章所述。