Как настроить .NET Core Dependency Injection для класса, где конструктор включает HttpClient и несколько строк? - PullRequest
0 голосов
/ 09 января 2019

Учитывая следующее определение класса .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 Ответ

0 голосов
/ 09 января 2019

Повышение вашего 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 потребителей. Как описано здесь , здесь и здесь , могут возникать многочисленные проблемы, когда экземпляры HttpClient повторно используются в течение срока действия приложения, которое будет использоваться с вашим текущая конфигурация Когда вы зарегистрируете MyService как Singleton, HttpClient станет зависимостью .

Вместо этого зарегистрируйте MyService как Scoped. В идеале , ASP.NET Core должен быть в состоянии обнаружить эту зависимую зависимость для вас, но в своей текущей реализации (v2.2) он этого не делает, что означает, что вам лучше защитить себя, сделав ваш непосредственный потребитель Scoped (и четко документирует, почему это так, чтобы не дать следующему разработчику снова все испортить).

...