.NET 7 Web API依赖注入报错:无法解析FruitType类型服务
问题分析
错误核心是依赖注入容器无法解析FruitType枚举类型的服务,原因如下:
MainProvider和FruitDecisionMaker的构造函数都依赖FruitType,但枚举类型默认不会被DI容器识别为可注入服务。- 当前服务注册方式没有为这两个类提供
FruitType实例。 - 额外问题:
TestRepository中错误地对同步方法TestMethod使用了await,会导致编译错误。
修复方案
1. 修正服务注册,注入枚举值
修改Program.cs中的服务注册代码,用工厂方法明确传入FruitType的值(示例用Apple,可按需调整):
var builder = WebApplication.CreateBuilder(args); // 注册IFruitDecisionMaker,指定枚举值 builder.Services.AddTransient<IFruitDecisionMaker>(sp => new FruitDecisionMaker(FruitType.Apple)); // 注册IMainProvider,传入枚举值 builder.Services.AddTransient<IMainProvider>(sp => new MainProvider(sp, FruitType.Apple)); // 补充注册ITestRepository(原代码遗漏,会导致TestController无法解析依赖) builder.Services.AddTransient<ITestRepository, TestRepository>(); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // 中间件配置部分保持不变
2. 修复同步方法调用错误
TestMethod是同步方法,无需await,修改TestRepository的GetDetailsAsync方法:
public async Task<int> GetDetailsAsync(CancellationToken cancellationToken) { // 移除await,直接调用同步方法 var res = _mainProvider.FruitDecisionMaker.TestMethod(1, 2); // 调整判断逻辑(int类型不会为null) if (res == 0) throw new Exception("No Data Found!"); // 保持异步方法签名,返回包装后的Task return await Task.FromResult(res); }
同时修正ITestRepository接口的返回类型:
public interface ITestRepository { Task<int> GetDetailsAsync(CancellationToken cancellationToken); }
3. 可选:优化MainProvider的Lazy初始化逻辑
原GetInstance方法未使用传入的fruitType,如果需要根据枚举值创建不同实例,可调整为:
private Lazy<T> GetInstance<T>(FruitType fruitType) => new Lazy<T>(() => (T)(object)new FruitDecisionMaker(fruitType));
验证修复
完成修改后重新运行项目:
- DI容器会通过工厂方法为
MainProvider和FruitDecisionMaker提供FruitType实例,解决服务构造错误。 TestRepository中的方法调用错误被修复,不会出现编译或运行时异常。
内容的提问来源于stack exchange,提问作者santosh kumar patro
相关产品推荐
相关产品推荐

