小编Ran*_*l W的帖子

如何在不“新建”类实例并自己提供参数的情况下进行依赖注入?

我有一个根据使用 NSwagStudio 生成的 OpenApi 定义创建的客户端。生成的代码具有接口和类。它在构造函数中需要一个 HttpClient。我为 DI 引擎进行了这样的设置。

services.AddScoped<IConsumerAdapterClient, ConsumerAdapterClient>(sp =>
{
    var httpClientFactory = sp.GetRequiredService<IHttpClientFactory>();
    var baseUrl = Configuration.GetSection("ConsumerAdapterConfig:EndpointBase").Value;
    return new ConsumerAdapterClient(baseUrl,httpClientFactory.CreateClient());
});
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎不太正确。经过一番搜索,我找到了这篇文章。现在相同的代码看起来像这样。

services.AddHttpClient<IConsumerAdapterClient, ConsumerAdapterClient>(client =>
{
    var baseUrl = Configuration.GetSection("ConsumerAdapterConfig:EndpointBase").Value;
    client.BaseAddress = new Uri(baseUrl);
});
Run Code Online (Sandbox Code Playgroud)

好的,这样更好。但现在我必须增加安全性。为此,我有一个名为 ClientCredentialProvider 的类,它负责使用客户端凭据流获取访问令牌的工作。我不想修改生成的代码(这只是要求维护问题),因此,我可以利用 NSwagStudio 将类生成为部分类的事实。这意味着我可以创建一个新的构造函数并将安全元素注入到类中,然后我可以在准备方法挂钩中使用它。

public partial class ConsumerAdapterClient
{
    private readonly IClientCredentialProvider _clientCredentialProvider;

    public ConsumerAdapterClient(HttpClient httpClient, IClientCredentialProvider clientCredentialProvider)
    {
        _httpClient = httpClient;
        _clientCredentialProvider = clientCredentialProvider;
        _settings = new System.Lazy<Newtonsoft.Json.JsonSerializerSettings>(CreateSerializerSettings);
    }

    protected async Task PrepareRequestAsync(HttpClient client, HttpRequestMessage request, StringBuilder url) …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection asp.net-core-3.1

5
推荐指数
1
解决办法
1848
查看次数