Я создаю экземпляр HttpClient
для каждого отдельного API, с которым работает мое веб-приложение.Управление несколькими экземплярами HttpClient с использованием Injection Dependency
Я хочу использовать инъекцию зависимостей с SimpleInjector, чтобы ввести HttpClient
в бизнес-классы. Например, у меня есть ITwitterBusiness
и IInstagramBusiness
, и оба они принимают HttpClient
в своем конструкторе.
Какова наилучшая практика регистрации нескольких объектов одного и того же типа с использованием Injection Dependency?
Я уверен, что часть проблемы может быть моей конструкцией, но вот некоторые идеи.
Моя первая идея состоит в том, чтобы использовать делегат при регистрации DI
container.Register<ITwitterBusiness>(() => new TwitterBusiness(httpClientTwitter));
кажется достаточно простым, но я не знаю, если этот метод имеет какие-либо плохие побочные эффекты, например, делая SimpleInjector работать медленнее или если я нарушаю шаблон дизайна.
Моя вторая идея заключается в том, чтобы использовать инъекцию на основе контекстаhttp://simpleinjector.readthedocs.io/en/latest/advanced.html#context-based-injection
Я считаю, что это позволит мне впрыснуть HttpClient определенный экземпляр к определенному классу. Все еще не совсем точно, как это работает.
Мне очень любопытно, могу ли я решить это чисто по дизайну. Например, создавая фиктивные классы. Я просто не нашел хороших примеров, но если я правильно понял, то мог бы создать фиктивные классы, такие как HttpClientTwitter
, который наследует HttpClient
, и таким образом я могу избавиться от неоднозначной регистрации.
Спасибо!
Спасибо, Стивен. Я забыл упомянуть, что все экземпляры HttpClient являются одноточечными, поэтому экземпляр HttpClient Twitter будет повторно использоваться с жизнью приложения. Я всегда стараюсь избегать статических переменных, но, я думаю, я мог бы использовать его как статическую переменную внутри TwitterBusiness и инициализировать ее только один раз, если в конструкторе нет значения. Как вы думаете? Для модульного тестирования я мог передать HttpMessageHandler конструктору. – raRaRa
@raRaRa вы даже можете зарегистрировать свой TwitterBusiness как singleton, если он не имеет гражданства (что обычно требуется). Это означает, что ваш httpclient все еще может быть переменной экземпляра, но я не думаю, что HttpClient является потокобезопасным. Поэтому создание его внутри каждого mrthod было бы безопаснее. – Steven
Он потокобезопасен и должен быть использован как можно больше. Вот почему я хочу, чтобы он был одиночным. В противном случае я бы просто создал экземпляр HttpClient по запросу в TwitterBusiness. Но вы определенно правы, TwitterBusiness может быть зарегистрирован как singleton. Я собираюсь обдумать это и попытаюсь придумать решение. Спасибо за помощь! :) – raRaRa