簡體   English   中英

使用依賴注入管理HttpClient的多個實例

[英]Managing multiple instances of HttpClient using Dependency Injection

我正在為Web應用程序正在通信的每個不同的API創建HttpClient實例。

我想將依賴注入與SimpleInjector一起使用,以將HttpClient注入業務類。 例如,我有ITwitterBusinessIInstagramBusiness ,它們都在其構造函數中接受HttpClient

使用依賴注入來注冊相同類型的多個對象時,最佳實踐是什么?

我很確定問題的一部分可能是我的設計,但是這里有一些想法。

我的第一個想法是在DI注冊中使用委托

container.Register<ITwitterBusiness>(() => new TwitterBusiness(httpClientTwitter));

看起來足夠簡單,但是我不知道此方法是否有任何不良副作用,例如,使SimpleInjector運行速度變慢,或者是否破壞了某些設計模式。

我的第二個想法是使用基於上下文的注入 http://simpleinjector.readthedocs.io/en/latest/advanced.html#context-based-injection

我相信這將允許我將某個HttpClient實例注入某個類。 仍然不確定這是如何工作的。

我很好奇我是否可以通過設計完全解決這個問題。 例如,通過創建虛擬類。 我只是沒有找到任何好的示例,但是如果我正確理解它,那么我可以創建諸如HttpClientTwitter虛擬類,該類繼承HttpClient ,這樣我就可以擺脫模棱兩可的注冊。

謝謝!

我的第一個想法是在DI注冊中使用委托。 看起來足夠簡單,但是我不知道此方法是否有任何不良副作用,例如,使SimpleInjector運行速度變慢,或者是否破壞了某些設計模式。

如果類型具有任何需要連接的應用程序組件,建議使用自動裝配(與注冊委托相反)。 自動接線簡化了配准,並允許Simple Injector分析對象圖。 在您的情況下,兩者似乎都無關緊要。 HttpClient不是應用程序組件,而是基礎結構類型。 似乎沒有其他依賴項,因此注冊委托不會引起任何可維護性問題。

與使用自動裝配相比,委托注冊的速度較慢,Simple Injector無法使用委托進行優化。 但它是非常, 非常不可能的,你這樣做的時候發現任何性能上的差異。 這不是您應該擔心的事情。

我的第二個想法是使用基於上下文的注入。 我相信這將允許我將某個HttpClient實例注入某個類。 仍然不確定這是如何工作的。

您可以根據上下文進行不同的注冊。 例如:

var httpClientTwitterRegistration = Lifestyle.Transient.CreateRegistration<HttpClient>(
    () => new HttpClient("https://twitter"),
    container);

container.RegisterConditional(typeof(HttpClient), httpClientTwitterRegistration,
    c => c.Consumer.ImplementationType == typeof(TwitterBusiness));

var httpClientInstagramRegistration = Lifestyle.Transient.CreateRegistration<HttpClient>(
    () => new HttpClient("https://instagram"),
    container);

container.RegisterConditional(typeof(HttpClient), httpClientInstagramRegistration,
    c => c.Consumer.ImplementationType == typeof(InstagramBusiness));

我很好奇我能否完全通過設計解決這個問題

通過將HttpClient注入TwitterBusiness類,您會獲得錯誤的靈活性。 您似乎可以進行兩個交換實現,但是由於HttpClient是一種具體類型,因此更改實現毫無意義。 由於TwitterBusiness直接與HttpClient通信,因此應將其作為實現細節。 換句話說,在TwitterBusiness移動HttpClient的創建。 您需要配置的任何參數(可能是URL)都可以注入TwitterBusiness 這樣, TwitterBusiness可以完全控制HttpClient的創建和處置,並且您可以注入唯一有趣的更改(URL)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM