ASP.NET Core Web API - 错误 CS0103 当前上下文中不存在名称 'FetchToken'

ASP.NET Core Web API - Error CS0103 The name 'FetchToken' does not exist in the current context

我正在实施 ASP.NET Core-6 Web API MediatR 和 Fluent Validation

我有这项服务:

public class MyService
{
    private readonly string baseUrl;
    private readonly ILogger<MyService> _logger;
    private readonly IMemoryCache _cache;
    public MyService(
        IConfiguration config,
        ILogger<MyService> logger,
        IMemoryCache cache
        )
    {
        _logger = logger;
        _cache = cache;
    }

    public async Task<OAuthLoginResponse> FetchToken()
    {
        string token = string.Empty;
        if (!_cache.TryGetValue("TOKEN", out token))
        {
            var tokenmodel = await this.Authenticate();
            if (tokenmodel != null)
            {
                var options = new MemoryCacheEntryOptions()
                    .SetAbsoluteExpiration(
                          TimeSpan.FromSeconds(int.Parse(tokenmodel.expires_in) - 2));

                token = JsonConvert.SerializeObject(tokenmodel);
                _cache.Set("TOKEN", token, options);
            }

        }
        return JsonConvert.DeserializeObject<OAuthLoginResponse>(token);
    }
}

然后我尝试调用 FetchToken 并在 CommandHandler 中实现它:

using Microsoft.Extensions.Logging;
using Application.Services;

public class CreateTokenInitiationCommandHandler : IRequestHandler<CreateTokenInitiationCommand, BaseResponse>
{
    private readonly IDbContext _dbContext;
    private readonly IMapper _mapper;
    private readonly ILogger<CreateTokenInitiationCommandHandler> _logger;
    //private readonly IMemoryCache _cache;
    public CreateTokenInitiationCommandHandler(IDbContext dbContext, IMapper mapper, ILogger<CreateTokenInitiationCommandHandler> logger)
    {
        _dbContext = dbContext;
        _mapper = mapper;
        _logger = logger;
    }
    public async Task<BaseResponse> Handle(CreateTokenInitiationCommand request, CancellationToken cancellationToken)
    {
        var response = new BaseResponse();
        try
        {
            var token = await FetchToken();
            var headers = new Dictionary<string, string>();
            headers.Add("Authorization", $"Bearer {token.access_token}");
        }
        catch (Exception ex)
        {
            _logger.LogError("An Error occured " + ex.ToString());
            response = new BaseResponse { response_code = "96", response_description = "Error occured, contact admin" };
        }

        return response;
    }
}

问题是它没有看到我导入到 CreateTokenInitiationCommandHandler

中的 FetchToken

我收到这个错误:

Error CS0103 The name 'FetchToken' does not exist in the current context

FetchToken 突出显示。

即使我添加使用 Application.Services 以导入 FetchToken,错误仍然存​​在

我该如何解决这个问题?

谢谢

创建IMyService

public interface IMyService 
{
   Task<OAuthLoginResponse> FetchToken()
}

public class MyService : IMyService
{
    ...
    public async Task<OAuthLoginResponse> FetchToken()
    {
        ... your code
    }
}

将其添加到 Program.cs 或 Startup.cs :

builder.Services.AddScoped<IMyService, MyService>();

然后只需将它添加到您的处理程序并使用它:

public class CreateTokenInitiationCommandHandler : IRequestHandler<CreateTokenInitiationCommand, BaseResponse>
{
    private readonly IDbContext _dbContext;
    private readonly IMyService _service;
    private readonly IMapper _mapper;
    private readonly ILogger<CreateTokenInitiationCommandHandler> _logger;
    //private readonly IMemoryCache _cache;
    public CreateTokenInitiationCommandHandler(IDbContext dbContext, IMapper mapper, IMyService service, ILogger<CreateTokenInitiationCommandHandler> logger)
    {
        _dbContext = dbContext;
        _mapper = mapper;
        _service = service;
        _logger = logger;
    }
    public async Task<BaseResponse> Handle(CreateTokenInitiationCommand request, CancellationToken cancellationToken)
    {
        var response = new BaseResponse();
        try
        {
            var token = await _service.FetchToken();
            var headers = new Dictionary<string, string>();
            headers.Add("Authorization", $"Bearer {token.access_token}");
        }
        catch (Exception ex)
        {
            _logger.LogError("An Error occured " + ex.ToString());
            response = new BaseResponse { response_code = "96", response_description = "Error occured, contact admin" };
        }

        return response;
    }
}