c# - 使用简单注入(inject)器自动注册通用存储库

标签 c# generics dependency-injection simple-injector

我无法找到使用简单注入(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/

相关文章:

java - 创建通用列表,其中列表的类型仅在运行时已知

generics - 在 F# 中使用泛型创建 EnumArray 类型

java - 从 Spring MVC Controller 访问服务层

java - Spring上下文初始化(java)

c# - 需要正则表达式帮助

c# - 是什么决定了我是否可以使用比较运算符?

c# - 在 C# 中将 Julian 日期与时间 (H/m/s) 转换为日期时间

c# - 如何在 ASP.NET Core 中获取没有构造函数注入(inject)的注入(inject)服务的实例?

c# - WPF:是否有可能将 "route"普通鼠标事件转换为 Windows 7 中的触摸事件

c# - EntityState.Deleted 不起作用,Remove(entity) 起作用吗?