c# – 使用依赖注入管理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,这样我就可以摆脱模糊的注册.

谢谢!

解决方法:

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).

上一篇:C#动态函数AmbigiousMatchException?


下一篇:Exchange Server 中间人劫持 RCE 漏洞分析