泛型仓储+内存数据库测试查询处理器时仓储实例为空问题
解决泛型仓储在单元测试中注入为空的问题
1. 检查泛型仓储的DI注册配置
特定仓储能正常工作但泛型仓储不行,大概率是测试项目的依赖注入容器没正确注册泛型仓储的接口与实现。确保注册代码包含泛型版本:
// 正确注册泛型仓储 services.AddScoped(typeof(IRepository<>), typeof(GenericRepository<>));
不要只注册ContractTypeRepository这类特定仓储,泛型注册是让容器能自动匹配IRepository<ContractType>到GenericRepository<ContractType>的关键。
2. 确认查询处理器的构造器参数匹配
检查查询处理器的构造器是否明确使用泛型仓储接口:
public class ContractTypeQueryProcessor { private readonly IRepository<ContractType> _contractTypeRepository; // 必须注入泛型版本的仓储接口 public ContractTypeQueryProcessor(IRepository<ContractType> contractTypeRepository) { _contractTypeRepository = contractTypeRepository; } }
避免使用非泛型的IRepository或错误的泛型参数,否则容器无法匹配到正确的仓储实例。
3. 确保测试类通过DI容器获取处理器实例
如果测试中直接new查询处理器,容器不会自动注入依赖。要么通过DI容器获取实例,要么手动传入泛型仓储实例:
// 方式1:通过DI容器获取 var processor = _serviceProvider.GetService<ContractTypeQueryProcessor>(); // 方式2:手动传入泛型仓储实例 var repository = new GenericRepository<ContractType>(fixture.DbContext); var processor = new ContractTypeQueryProcessor(repository);
如果用自定义DI容器,要确保在测试Fixture中完成泛型仓储、数据库上下文、查询处理器的完整注册。
4. 验证泛型仓储实现的正确性
确认GenericRepository<T>正确实现IRepository<T>,且构造器接收数据库上下文:
public class GenericRepository<T> : IRepository<T> where T : class { protected readonly YourDbContext _context; public GenericRepository(YourDbContext context) { _context = context; } // 实现IRepository<T>的所有接口方法 }
泛型约束where T : class要和领域实体的类型匹配,避免容器无法实例化仓储。
内容的提问来源于stack exchange,提问作者Vagner Wentz
相关产品推荐
相关产品推荐

