代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

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

  •  1
  • Pure.Krome  · 技术社区  · 6 年前

    给定以下.NET Core 2.2类定义:

    public class MyService : ISomeService
    {
        public MyService(string apiKey, HttpClient httpClient) { ... } 
    }
    

    如何设置DI以使用 HttpClientFactory 并在IsomeService被构造函数注入到 其他 课堂?例如。

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

    有人能帮忙吗?干杯:

    1 回复  |  直到 6 年前
        1
  •  2
  •   Nkosi    6 年前

    提升你的 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 ,当 HTTP客户端 实例将在应用程序的持续时间内重用,该应用程序将与当前配置一起使用。当你注册的时候 我的服务 作为一个 独生子女 , HTTP客户端 将成为 Captive Dependency .

    相反,注册您的 我的服务 作为 Scoped . Ideally ,ASP.NET核心应该能够为您检测到这种强制依赖关系,但在当前的实现(V2.2)中,它没有这样做,这意味着您最好让自己成为直接消费者来保护自己。 范围的 (并且清楚地记录这是为什么,以防止下一个开发人员再次把事情搞砸)。