我正在创建一个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