【问题标题】:Dependency injection class that is resolved by async provider由异步提供者解析的依赖注入类
【发布时间】:2021-02-18 00:46:49
【问题描述】:

我有一个在其构造函数中接受访问令牌的 api 客户端

public class ApiClient : IApiClient
{
    public ApiClient(string accessToken)
}

要获得该 api 令牌,我需要创建另一个类的实例并调用方法 GetTokenAsync()

public class TokenClient
{
     public Task<string> GetTokenAsync();
}

现在我想将IApiClient 注入我的TestService

public class TestService
{
   public TestService(IApiClient client)
}

但是不能以这种方式注册实例

services.AddScoped<IApiClient,ApiClient>(async x=> 
{
  tokenClient = x.GetService<TokenClient>();
  var token = await tokenClient.GetTokenAsync();
  return new ApiClient(token);
}

为了克服我创建了ApiClientProvider

public class ApiClientProvider()
{
  public async Task<IApiClient> GetClientAsync()
  {
    tokenClient = x.GetService<TokenClient>();
      var token = await tokenClient.GetTokenAsync();
      return new ApiClient(token);
  }
}

现在我将它注入TestService 但在每种方法中我都必须使用

IApiClient apiClient= await _apiClientProvider.GetClientAsync();

我不喜欢这段代码,我更喜欢注入依赖项而不是在每个函数中解析,但是我看不到任何解决方法。您能否告知是否可以将其移至注册或不应该去那里。

【问题讨论】:

标签: c# .net .net-core dependency-injection


【解决方案1】:

你应该稍微改变你的设计。

与其将字符串注入您的ApiClient,不如注入ITokenClient

public interface ITokenClient
{
    Task<string> GetTokenAsync();
}

public class TokenClient : ITokenClient
{
     public Task<string> GetTokenAsync() { }
}

public class ApiClient : IApiClient
{
    readonly Task<string> tokenTask;

    public ApiClient(ITokenClient tokenClient)
    {
        // Initiate the token request on construction
        tokenTask = tokenClient.GetTokenAsync();
    }

    public async Task SomeMethod()
    {
        string token = await tokenTask;
        // Use your token..
    }
}

任何依赖令牌的方法都必须是async,但当您调用 API 时,它们很可能是 async

使用此方法,您只需将客户注册到容器中,不需要工厂/提供者类型。

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2012-06-11
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多