如何为构造函数包含 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 => new MSC("api key"));
怎么样任何对象)
具有配置值的参数对象可能有什么处理逻辑?
在那种特殊情况下,我会说:别担心 :)以上是关于如何为构造函数包含 HttpClient 和一些字符串的类设置一些 .NET Core 依赖注入?的主要内容,如果未能解决你的问题,请参考以下文章
我应该如何为 dnx451 和 dnxcore50 引用 HttpClient?