如何为构造函数包含 HttpClient 和一些字符串的类设置一些 .NET Core 依赖注入?

Posted

技术标签:

【中文标题】如何为构造函数包含 HttpClient 和一些字符串的类设置一些 .NET Core 依赖注入?【英文标题】:How to setup some .NET Core Dependency Injection for a class where constructor includes an HttpClient and some strings? 【发布时间】:2019-01-09 11:12:55 【问题描述】:

鉴于以下 .NET Core 2.2 类定义:

public class MyService : ISomeService

    public MyService(string apiKey, HttpClient httpClient)  ...  

如何设置 DI 以使用 HttpClientFactory 并在将 ISomeService 构造函数注入到 other 类时使用此具体实例?例如

services.AddHttpClient<ISomeService, MyService>();
services.AddSingleton<ISomeService, MyService>(
    sp => new MyService("some api key from config", sp.GetService<??????????>() );

【问题讨论】:

假设我无法修改MyService。是的,我可以创建一个继承它的父类 - 但为了论证,让我们再次拒绝。 改为注入 IHttpClientFactory。 【参考方案1】:

将您的apiKey 配置值提升为参数对象:

public sealed class MyServiceConfiguration

    public readonly string ApiKey;

    public MyServiceConfiguration(string apiKey)
    
        if (string.IsNullOrEmpty(apiKey)) throw new ArgumentException(...);
        this.ApiKey = apiKey;
    

并将您的 MyService 构造函数更改为:

public MyService(MyServiceConfiguration config, HttpClient httpClient)

新的MyServiceConfiguration可以按如下方式轻松注册:

services.AddSingleton(new MyServiceConfiguration("some api key from config"));

请注意将HttpClient 注入Singleton 消费者。如here、here 和here 所述,当在应用程序期间重复使用HttpClient 实例时会出现许多问题,这将与您当前的配置一起使用。当您将MyService 注册为Singleton 时,HttpClient 将变为Captive Dependency。

请将您的MyService 注册为Scoped。 Ideally,ASP.NET Core 应该能够为您检测到这种 Captive Dependency,但在其当前实现 (v2.2) 中它没有这样做,这意味着您最好通过让您的直接消费者来保护自己@ 987654340@(并清楚地记录为什么会这样,以防止下一个开发人员再次搞砸)。

【讨论】:

把它改成services.AddSingleton(sp =&gt; new MSC("api key"));怎么样任何对象) 具有配置值的参数对象可能有什么处理逻辑? 在那种特殊情况下,我会说:别担心 :)

以上是关于如何为构造函数包含 HttpClient 和一些字符串的类设置一些 .NET Core 依赖注入?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何为 dnx451 和 dnxcore50 引用 HttpClient?

如何为填字游戏获得多个解决方案?

如何为派生类创建构造函数? [复制]

如何为联合成员提供一个简单的类构造函数?

如何为 HttpClient 请求设置 Content-Type 标头?

如何为父类构造函数提供值,其中父构造函数的参数比c#中静态void main的子类多? [关闭]