.NET依赖注入异常:ICyborgData无法解析致服务构造失败
问题解决:无法解析ICyborgData以激活CyborgService
核心原因
你遇到的激活失败问题,本质是DI容器中未注册ICyborgData接口与对应的实现类CyborgData。CyborgService的构造函数依赖ICyborgData,但.NET依赖注入系统找不到该服务的注册信息,因此抛出激活异常。
另外,IMongoDataAccess的ImplementationType为null,是因为你使用了直接实例化对象的注册方式:
builder.Services.AddSingleton<IMongoDataAccess>(new MongoDataAccess("connection string"));
这种方式下,DI容器仅持有你传入的实例,不会跟踪其实现类型,不过这不是导致当前激活失败的直接原因,但可以优化。
解决方案
1. 注册ICyborgData服务
在Program.cs中添加ICyborgData与CyborgData的注册,根据业务场景选择合适的生命周期(示例用Transient,可按需调整为Scoped或Singleton):
// 注册ICyborgData及其实现类 builder.Services.AddTransient<ICyborgData, CyborgData>();
2. 优化IMongoDataAccess的注册方式
将直接实例化的方式改为让DI容器管理实例创建,这样ImplementationType会被正确跟踪,同时更符合DI最佳实践:
// 使用工厂方式注册,允许DI容器管理实例 builder.Services.AddSingleton<IMongoDataAccess>(sp => new MongoDataAccess("connection string"));
如果MongoDataAccess还依赖其他服务,推荐从配置读取连接字符串并通过类型注册:
// 从配置读取连接字符串(更灵活的方式) var connectionString = builder.Configuration.GetConnectionString("MongoDB"); builder.Services.AddSingleton<IMongoDataAccess, MongoDataAccess>(sp => new MongoDataAccess(connectionString));
完整注册示例
调整后的Program.cs服务注册部分:
var connectionString = builder.Configuration.GetConnectionString("MongoDB"); builder.Services.AddSingleton<IMongoDataAccess>(sp => new MongoDataAccess(connectionString)); builder.Services.AddTransient<ICyborgData, CyborgData>(); builder.Services.AddTransient<ICyborgService, CyborgService>();
内容的提问来源于stack exchange,提问作者Dorialean
相关产品推荐
相关产品推荐

