.NET Core Mediatr Usage not all code paths return 一个值

.NET Core Mediatr Usage not all code paths return a value

在我的 API 中,我正在尝试使用 MediatR;所以在我的控制器代码中,我写道:

[HttpPost("AdminLogin")    
public async Task<ActionResult<Admin>> GetContractById(Admin admin)
{
    var response = await _mediator.Send(new UserLoginRequest(admin));    

    if (response.HasError)
    {
        return BadRequest(response);
    }    

    return Ok(response);
}

然后在我的UserLoginRequest.cs中写了这段代码:

using MediatR;
using SinavAlemiPanel.Domain.Models;
using SinavAlemiPanel.Infrastructure.Interfaces;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SinavAlemiPanel.Application.Requests.UserRequests
{
    public class UserLoginRequest :IRequest<BaseResponse<Admin>>
    {
        private Admin admin;

        public UserLoginRequest(Admin admin)
        {
            this.admin = admin;
        }

        public Admin UserCredentials { get; set; }
    }

    public sealed class UserLoginRequestHandlers : IRequestHandler<UserLoginRequest, BaseResponse<Admin>>
    {
        private readonly IUserService _userService;

        public UserLoginRequestHandlers(IUserService userService)
        {
            _userService = userService;
        }

        public async Task<BaseResponse<Admin>> Handle(UserLoginRequest request, CancellationToken cancellationToken)
        {
            await Task.Run(() =>
            {
                return _userService.Login(request.UserCredentials);
            });
        }
    }
}

在我的服务中,我有:

using Dapper;
using SinavAlemiPanel.Domain.Models;
using SinavAlemiPanel.Infrastructure.Interfaces;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace SinavAlemiPanel.Infrastructure.Services
{
    public class UserService : IUserService
    {
        private readonly IBaseService _baseService;
        private readonly DBConnection _db;

        public UserService(IBaseService baseService)
        {
            _baseService = baseService;
        }

        public Admin Login(Admin admin)
        {   
            Admin result = new Admin();
            var dynamicParams = new DynamicParameters();
            var conn = _baseService.GetConnection(_db.GetConnString());

            try
            {
                dynamicParams.Add("@username", admin.Username, DbType.String, ParameterDirection.Input);
                dynamicParams.Add("@pass", admin.Password, DbType.String, ParameterDirection.Input);

                result = SqlMapper.Query<Admin>(conn, "dbo.SP_Admin_Login @username, @pass", dynamicParams).SingleOrDefault();

                conn.Close();

                if (result != null && result.Id > 0)
                {
                    result.Accesses = (result != null && result.Id > 0) ? Accesses(result.Id) : new List<Access>();
                }

                return result;
            }
            catch(Exception ex)
            {
                return result;
            }
        }

        public List<Access> Accesses(int refAdmin)
        {
            List<Access> result = new List<Access>();
            var dynamicParams = new DynamicParameters();

            var conn = _baseService.GetConnection(_db.GetConnString());

            try
            {
                dynamicParams.Add("@refAdmin", refAdmin, DbType.Int32, ParameterDirection.Input);

                result = SqlMapper.Query<Access>(conn, "dbo.SP_Admin_Accesses @refAdmin", dynamicParams).ToList();

                conn.Close();

                return result;
            }
            catch (Exception e)
            {
                return result;
            }
        }
    }
}

我的问题是请求句柄中的代码不接受,我收到此错误:

Error CS0161
'UserLoginRequestHandlers.Handle(UserLoginRequest, CancellationToken)': not all code paths return a value

我是 C# 新手,所以无法检测到错误。我该如何解决这个问题?

提前致谢

您在 Handle 方法中缺少 return 语句,但单独添加它不会修复您需要翻译 Admin returned 的编译_userService.LoginBaseResponse<Admin>。此外,由于 _userService.Login 是一种同步方法 - 不需要 Task.Run 和 assync-await - 请改用 Task.FromResult。像这样的事情(假设存在相应的 BaseResponse ctor):

public Task<BaseResponse<Admin>> Handle(UserLoginRequest request, CancellationToken cancellationToken)
{
    var admin = _userService.Login(request.UserCredentials);
    return Task.FromResult(new BaseResponse<Admin>(admin)); // no need for Task.Run and async-await cause Login is synchronous method
}

另一种方法是将您的服务创建为 async:

 public async Task<Admin> Login(Admin admin)

并且您需要在 BaseResponse class:

中有相应的构造函数
public async Task<BaseResponse<Admin>> Handle(UserLoginRequest request, CancellationToken cancellationToken)
{   
    Admin admin = await _userService.Login(request.UserCredentials);           
   
    return new BaseResponse<Admin>(admin);            
}

BaseResponse 示例:

public class BaseResponse<T>
{
    private T Response;

    public BaseResponse(T response)
    {
        Response = response;
    }
}