.NET Core使用MediatR报CS0161并非所有代码路径返回值如何解决
错误原因及解决方案
1. CS0161编译错误修复
报错的根本原因是UserLoginRequestHandlers.Handle方法声明要求返回Task<BaseResponse<Admin>>类型,但你当前的代码只执行了await Task.Run(...)操作,没有返回任何值,同时也没有将登录返回的Admin对象包装为要求的BaseResponse<Admin>类型。
修改后的Handle方法参考如下:
public async Task<BaseResponse<Admin>> Handle(UserLoginRequest request, CancellationToken cancellationToken) { // 接收Login方法返回的Admin结果 var loginResult = await Task.Run(() => _userService.Login(request.UserCredentials)); // 包装为BaseResponse返回,可根据你自己的BaseResponse定义调整逻辑 return new BaseResponse<Admin> { Data = loginResult, HasError = loginResult == null || loginResult.Id <= 0, // 其他字段比如Message等可自行补充 }; }
如果你的_userService.Login是纯同步方法,没必要额外套Task.Run,可以简化为同步写法减少性能损耗:
public Task<BaseResponse<Admin>> Handle(UserLoginRequest request, CancellationToken cancellationToken) { var loginResult = _userService.Login(request.UserCredentials); return Task.FromResult(new BaseResponse<Admin> { Data = loginResult, HasError = loginResult == null || loginResult.Id <= 0 }); }
2. 隐藏的空引用运行错误修复
你当前的UserLoginRequest类存在逻辑bug:构造函数将传入的admin参数赋值给了私有字段,没有给公开的UserCredentials属性赋值,后续Handle方法中取request.UserCredentials会得到null,导致登录逻辑完全无法正常运行。
修改UserLoginRequest构造函数即可:
public class UserLoginRequest :IRequest<BaseResponse<Admin>> { // 没用的私有字段admin可以直接删除 public UserLoginRequest(Admin admin) { UserCredentials = admin; // 直接给公开属性赋值 } public Admin UserCredentials { get; set; } }
3. 其他需要修正的潜在问题
你的UserService类中DBConnection _db字段没有初始化,构造函数仅注入了IBaseService,后续调用_db.GetConnString()会直接抛出空引用异常。需要修改构造函数注入DBConnection:
public UserService(IBaseService baseService, DBConnection db) { _baseService = baseService; _db = db; // 给DBConnection字段赋值 }
另外别忘了在依赖注入容器中注册IUserService、DBConnection以及MediatR的处理器,否则运行时会触发服务解析异常。
内容的提问来源于stack exchange,提问作者mr_coder
相关产品推荐
相关产品推荐

