C# 由异步提供程序解析的依赖项注入类
我有一个api客户端,它的构造函数接受访问令牌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
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..
}
}