raR*_*aRa 5 c# dependency-injection ambiguous simple-injector dotnet-httpclient
HttpClient我正在为我的 Web 应用程序正在通信的每个不同的 API创建一个实例。
我想使用依赖注入和SimpleInjector来注入HttpClient业务类。例如,我有ITwitterBusiness和IInstagramBusiness,并且它们都HttpClient在其构造函数中接受。
使用依赖注入注册多个相同类型的对象时,最佳实践是什么?
我很确定问题的一部分可能是我的设计,但这里有一些想法。
我的第一个想法是在 DI 注册中使用 delegate
container.Register<ITwitterBusiness>(() => new TwitterBusiness(httpClientTwitter));
Run Code Online (Sandbox Code Playgroud)
看起来很简单,但我不知道这种方法是否有任何不良副作用,例如使 SimpleInjector 运行速度变慢或者我是否破坏了某些设计模式。
我的第二个想法是使用基于上下文的注入 http://simpleinjector.readthedocs.io/en/latest/advanced.html#context-based-injection
我相信这将允许我将某个 HttpClient 实例注入某个类。仍然不确定这是如何工作的。
我很好奇是否可以纯粹通过设计来解决这个问题。例如通过创建虚拟类。我只是还没有找到任何好的例子,但是如果我理解正确,那么我可以创建虚拟类,例如HttpClientTwitter继承HttpClient,这样我就可以摆脱不明确的注册。
谢谢!
我的第一个想法是在 DI 注册中使用 delegate。看起来很简单,但我不知道这种方法是否有任何不良副作用,例如使 SimpleInjector 运行速度变慢或者我是否破坏了某些设计模式。
如果类型有任何需要连接的应用程序组件,建议使用自动连接(与注册委托相反)。自动连接简化了注册并允许简单注入器分析对象图。在你的情况下,两者似乎都无关紧要。它HttpClient不是应用程序组件,而是基础设施类型。似乎没有其他依赖项,因此注册委托不会造成任何可维护性问题。
与使用自动装配相比,委托注册速度较慢,简单注入器无法使用委托进行尽可能多的优化。然而,在执行此操作时,您非常非常不可能注意到任何性能差异。这不是您应该担心的事情。
我的第二个想法是使用基于上下文的注入。我相信这将允许我将某个 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));
Run Code Online (Sandbox Code Playgroud)
我很好奇是否可以纯粹通过设计来解决这个问题
通过将 an 注入HttpClient到TwitterBusiness类中,您会获得灵活性的错误感觉。您似乎可以实现两个交换实现,但由于HttpClient是具体类型,因此更改实现没有任何意义。由于TwitterBusiness直接与 通信HttpClient,因此应该将其作为实现细节。换句话说,移动HttpClientinside的创建TwitterBusiness。您需要配置的任何参数(可能是 url)都可以注入到TwitterBusiness. 这种方式TwitterBusiness可以完全控制 的创建和处置,HttpClient并且您注入唯一需要更改的内容(url)。
| 归档时间: |
|
| 查看次数: |
2905 次 |
| 最近记录: |