我正在創建一個HttpClient
的實例,用於我的Web應用程序正在與之通信的每個不同的API。使用依賴注入管理HttpClient的多個實例
我想使用依賴注入SimpleInjector將HttpClient
注入業務類。例如,我有ITwitterBusiness
和IInstagramBusiness
,並且他們兩人都在其構造函數中接受HttpClient
。
當使用依賴注入來註冊同一類型的多個對象時,最佳實踐是什麼?
我很確定問題的一部分可能是我的設計,但這裏有一些想法。
我的第一個想法是在DI註冊
container.Register<ITwitterBusiness>(() => new TwitterBusiness(httpClientTwitter));
似乎很簡單的使用委託,但我不知道這種方法有任何不良的副作用,例如通過使SimpleInjector運行速度較慢或者如果我打破了一些設計模式。
我的第二個想法是使用基於上下文注入http://simpleinjector.readthedocs.io/en/latest/advanced.html#context-based-injection
我相信這會讓我注入了一定HttpClient的實例,以某一類。仍然不完全確定這是如何工作的。
我很好奇,如果我可以純粹的設計解決這個問題。例如通過創建虛擬類。我只是沒有找到任何好的例子,但如果我理解正確的話,我可以創建虛擬類,如HttpClientTwitter
,它繼承HttpClient
,這樣我就可以擺脫模糊的註冊。
謝謝!
謝謝史蒂文。我忘了提及所有的HttpClient實例都是單例,所以Twitter HttpClient實例將在應用程序的生命週期中重用。我總是傾向於避免靜態變量,但我想我可以將它作爲TwitterBusiness中的一個靜態變量,並且只在構造函數中爲null時初始化它。你怎麼看?對於單元測試,我可以將HttpMessageHandler傳遞給構造函數。 – raRaRa
@raRaRa你甚至可以註冊你的TwitterBusiness作爲單身人士,以防它無狀態(通常應該)。這意味着你的httpclient仍然可以是一個實例變量,但我不認爲HttpClient是線程安全的。因此,在每一個內部創建它都是最安全的。 – Steven
它是線程安全的,應儘可能重用。這就是爲什麼我希望它是單身人士。否則,我只需在TwitterBusiness上按需創建HttpClient的實例。但你絕對是對的,TwitterBusiness可以註冊爲單身人士。我會考慮通過並嘗試提出一個決定。謝謝您的幫助! :) – raRaRa