.NET6依赖注入异常:无法解析Repository服务以激活CategoryService
解决.NET6依赖注入无法解析泛型仓储的问题
问题根源
你遇到的System.AggregateException和InvalidOperationException本质是同一个问题:依赖注入容器中未注册IRepository<Category>(或其实现Repository<Category>)的服务映射,导致激活CategoryService时无法找到所需的仓储实例。
解决方案步骤
1. 在Program.cs中注册泛型仓储服务
打开你的Program.cs,在var builder = WebApplication.CreateBuilder(args);之后,添加泛型仓储的注册代码:
// 注册泛型仓储接口与实现(生命周期为Scoped,适配Web应用场景) builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
这行代码会告诉DI容器:当任何组件需要IRepository<T>类型的依赖时,自动提供对应的Repository<T>实例。
2. 注册特定仓储(如果存在ICategoryRepository)
如果你的ICategoryRepository继承自IRepository<Category>且有对应的CategoryRepository实现,需要额外注册该特定仓储的映射:
// 注册特定仓储接口与实现(仅当存在ICategoryRepository时需要) builder.Services.AddScoped<ICategoryRepository, CategoryRepository>();
3. 确保服务层已正确注册
确认ICategoryService与CategoryService的映射已添加到DI容器:
// 注册服务层接口与实现 builder.Services.AddScoped<ICategoryService, CategoryService>();
4. 验证CategoryService的构造函数依赖
CategoryService的构造函数必须依赖抽象接口而非具体实现,示例如下:
public class CategoryService : ICategoryService { // 依赖抽象IRepository<Category>,而非具体的Repository<Category> private readonly IRepository<Category> _categoryRepository; public CategoryService(IRepository<Category> categoryRepository) { _categoryRepository = categoryRepository; } // 业务方法实现... }
如果使用ICategoryRepository,则构造函数调整为:
public CategoryService(ICategoryRepository categoryRepository) { _categoryRepository = categoryRepository; }
5. 检查仓储类的依赖
如果Repository<T>的构造函数依赖了其他服务(比如数据库上下文DbContext),需要确保这些服务也已注册。例如:
// 注册DbContext(根据你的实际上下文名称和连接字符串配置调整) builder.Services.AddDbContext<StockDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
验证
完成上述注册后,重新启动项目,DI容器将能正确解析CategoryService所需的仓储实例,相关异常即可解决。
内容的提问来源于stack exchange,提问作者hassysl
相关产品推荐
相关产品推荐

