.NET Core依赖注入中注册非具象Repository的作用是什么?
.NET Core依赖注入中注册泛型仓储的作用?
services.AddTransient(typeof(IRepository<>), typeof(Repository<>)); services.AddTransient<IProductRepository, ProductRepository>();
上述代码是.NET Core中的依赖注入(DI)配置。我有一个基类仓储Repository<T>,以及继承自该基类的具象仓储(例如:ProductRepository)。随后我在对应的服务类中注入相应的仓储,服务类再被注入到控制器中。
问题
请问如下代码行的作用是什么——即:在依赖注入配置中注册非具象Repository的目的是什么?
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
回答
这行代码是注册泛型仓储的默认实现,核心作用主要有三点:
- 减少重复注册的冗余工作:如果你的系统里有大量类似
ProductRepository的具象仓储,它们都基于Repository<T>实现了IRepository<T>,那你不用挨个手动注册每个IXXXRepository。只要在需要的地方注入IRepository<实体类型>,DI容器就会自动实例化对应的Repository<实体类型>。 - 支持通用仓储的依赖注入:如果某个服务类不需要特定的
IProductRepository,只需要具备操作任意实体的通用CRUD能力,就可以直接注入IRepository<T>。比如写public class OrderService(IRepository<Order> orderRepo),DI容器会根据你注册的泛型映射,自动创建Repository<Order>实例注入进去。 - 统一维护通用仓储逻辑:所有通过这个泛型注册生成的仓储,都会复用
Repository<T>里的通用代码(比如基础的增删改查)。后续如果要调整通用仓储的实现逻辑,只需要修改Repository<T>这一处,所有依赖它的地方都会自动同步更新,不用逐个修改各个具象仓储的注册和实现。
另外要注意,你已经注册了IProductRepository -> ProductRepository,当注入IProductRepository时,容器会优先使用这个具象的注册;只有当注入IRepository<Product>时,才会触发泛型注册的Repository<Product>实例化,二者互不冲突,相当于给不同接口提供了不同的实现选项。
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

