C# 由异步提供程序解析的依赖项注入类

C# 由异步提供程序解析的依赖项注入类,c#,.net,.net-core,dependency-injection,C#,.net,.net Core,Dependency Injection,我有一个api客户端,它的构造函数接受访问令牌 public class ApiClient : IApiClient { public ApiClient(string accessToken) } 要获取该api标记,我需要创建另一个类的实例并调用方法GetTokenAsync() 但是,不可能以这种方式注册实例 services.AddScoped<IApiClient,ApiClient>(async x=> { tokenClient = x.GetS

我有一个api客户端,它的构造函数接受访问令牌

public class ApiClient : IApiClient
{
    public ApiClient(string accessToken)
}
要获取该api标记,我需要创建另一个类的实例并调用方法GetTokenAsync()

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

services.AddScoped<IApiClient,ApiClient>(async x=> 
{
  tokenClient = x.GetService<TokenClient>();
  var token = await tokenClient.GetTokenAsync();
  return new ApiClient(token);
}
现在我将它注入到
TestService
但在我必须使用的每一种方法中

IApiClient apiClient= await _apiClientProvider.GetClientAsync();

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

您应该稍微更改您的设计

不要向
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..
    }
}
公共接口ITokenClient
{
任务GetTokenAsync();
}
公共类令牌客户端:ITokenClient
{
公共任务GetTokenAsync(){}
}
公共类ApiClient:IApiClient
{
只读任务标记任务;
公共ApiClient(ITokenClient tokenClient)
{
//在构造时启动令牌请求
tokenTask=tokenClient.GetTokenAsync();
}
公共异步任务方法()
{
字符串令牌=等待令牌任务;
//使用你的代币。。
}
}
任何依赖令牌的方法都必须是
async
,但在调用API时,它们很可能是
async


使用此方法,您只需向容器注册客户端,而不需要工厂/提供商类型。

您应该稍微更改您的设计

不要向
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..
    }
}
公共接口ITokenClient
{
任务GetTokenAsync();
}
公共类令牌客户端:ITokenClient
{
公共任务GetTokenAsync(){}
}
公共类ApiClient:IApiClient
{
只读任务标记任务;
公共ApiClient(ITokenClient tokenClient)
{
//在构造时启动令牌请求
tokenTask=tokenClient.GetTokenAsync();
}
公共异步任务方法()
{
字符串令牌=等待令牌任务;
//使用你的代币。。
}
}
任何依赖令牌的方法都必须是
async
,但在调用API时,它们很可能是
async


使用此方法,您只需向容器注册您的客户端,而不需要工厂/提供商类型。

这是否回答了您的问题?这不回答你的问题吗?
IApiClient apiClient= await _apiClientProvider.GetClientAsync();
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..
    }
}