Webアプリケーションが通信している別個のAPIごとにHttpClient
のインスタンスを作成しています。依存性注入を使用してHttpClientの複数のインスタンスを管理する
ビジネスクラスにHttpClient
を注入するには、SimpleInjectorの依存性注入を使用します。たとえば、私はITwitterBusiness
とIInstagramBusiness
を持っていて、どちらもそのコンストラクタにHttpClient
を受け入れます。
依存性注入を使用して同じタイプの複数のオブジェクトを登録する場合のベストプラクティスは何ですか?
私はこの問題の一部が私のデザインになる可能性があると確信していますが、ここにいくつかのアイデアがあります。
私の最初のアイデアは、十分に単純なようだが、この方法はSimpleInjectorが遅くなることによって、例えば、任意の悪い副作用を持っている場合、私は知りませんDI登録
container.Register<ITwitterBusiness>(() => new TwitterBusiness(httpClientTwitter));
にデリゲートを使用することですまたは私はいくつかのデザインパターンを壊している場合。
私の第二の考えは、私はこれは私が特定のクラスに特定のHttpClientインスタンスを注入することを可能にすると信じてコンテキストベースの注入http://simpleinjector.readthedocs.io/en/latest/advanced.html#context-based-injection
を使用することです。それがどのように機能するかはまだ正確には分かりません。
これを純粋に設計で解決できるかどうかは非常に不思議です。たとえば、ダミークラスを作成します。私はちょうど良い例は見つけられませんでしたが、正しく理解すれば、HttpClientTwitter
のようなダミークラスを作成してHttpClient
を継承し、あいまいな登録を取り除くことができます。
ありがとうございます!
ありがとうSteven。私はすべてのHttpClientインスタンスがシングルトンであることを忘れていたので、TwitterのHttpClientインスタンスはアプリケーションの寿命とともに再利用されます。私は常に静的変数を避ける傾向がありますが、私はTwitterBusiness内の静的変数としてそれを持つことができ、コンストラクタでnullの場合は一度だけ初期化すると思います。どう思いますか?ユニットテストでは、HttpMessageHandlerをコンストラクタに渡すことができます。 – raRaRa
@raRaRa TwitterBusinessをステートレス(通常はそうすべき)の場合に備えて、シングルトンとして登録することさえできます。これは、あなたのhttpclientがまだインスタンス変数であることを意味しますが、私はHttpClientがスレッドセーフではないと思います。だから、それをあらゆるmrthodの中に作ることは最も安全でしょう。 – Steven
スレッドセーフなので、できるだけ再利用する必要があります。だから私はそれをシングルトンにしたい。それ以外の場合は、TwitterBusinessでHttpClientのインスタンスをオンデマンドで作成します。しかし、間違いなく、TwitterBusinessはシングルトンとして登録することができます。私はこれを考え、決断を下すつもりです。助けてくれてありがとう! :) – raRaRa