我正在为我的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,这样我就可以摆脱模糊的注册.
谢谢!
解决方法:
My first idea is to use delegate in the DI registration. Seems simple enough, but I don’t know if this method has any bad side effects, for example by making SimpleInjector run slower or if I’m breaking some design pattern.
如果类型具有需要连接的任何应用程序组件,则建议使用自动布线(与注册委托相反).自动布线简化了注册,并允许Simple Injector分析对象图.在你的情况下,两者似乎都不关心. HttpClient不是应用程序组件,而是基础结构类型.似乎没有其他依赖项,因此注册委托不会造成任何可维护性问题.
与使用自动布线相比,委托注册速度较慢,Simple Injector无法使用委托进行优化.但是,在执行此操作时,您发现任何性能差异的可能性非常小.这不是你应该担心的事情.
My second idea is to use Context based injection. I believe this will allow me to inject a certain HttpClient instance to a certain class. Still not exactly sure how this works.
您可以根据上下文进行不同的注册.例如:
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));
I’m very curious if I could solve this purely by design
通过将HttpClient注入到TwitterBusiness类中,您会获得错误的灵活性.您似乎能够进行两次交换实现,但由于HttpClient是一种具体类型,因此更改实现是没有意义的.由于TwitterBusiness直接与HttpClient通信,因此应该将其作为实现细节.换句话说,在TwitterBusiness中移动HttpClient的创建.您需要配置的任何参数(可能是url)都可以注入到TwitterBusiness中.通过这种方式,TwitterBusiness可以完全控制HttpClient的创建和处理,并且您可以注入唯一有趣的变化(url).