【问题标题】:Create two singleton services that implement the same interface创建两个实现相同接口的单例服务
【发布时间】:2017-04-21 10:30:53
【问题描述】:

我有一个 ASP.NET Core 项目(我的第一个),它需要两个内部“序列器”来执行特定任务。第一个是这样实现的:

在 Startup.cs 的 ConfigureServices 方法中:

services.AddSingleton<ISequencer, ProfileSequencer>();

当然,我已经定义了接口和实现,并且运行良好。但是我不确定如何添加第二个音序器,它实现了相同的接口,但实现方式略有不同。

services.AddSingleton<ISequencer, ChargeSequencer>();

ASP.NET 并没有抱怨这一点,但是现在当我将 ISequencer 注入到我的类中时,我无法想象它是如何知道要使用哪个单例的。我怀疑(但不确定)第二个单例有效地取代了第一个。

这里可能存在一些错误的设计决定,因此我将接受一个描述如何注入两个实现相同接口的不同单例的答案,或者如果需要另一种合理的方法来解决这个问题。谢谢!

【问题讨论】:

  • 感谢您的链接 - 我同意这本质上是重复的。因为我找到了针对不同服务类型的其他解决方案,所以我对单例实现的搜索词很感兴趣。

标签: c# asp.net dependency-injection asp.net-core


【解决方案1】:

无法注册相同接口的两个服务 - 第二次注册将首先覆盖。但我建议你快速解决你的问题:

1) 创建嵌套接口并使用它们进行注册:

ISomeSpecificSequencer : ISequencer {}
IOtherSpecificSequencer : ISequencer {}

2) 使用工厂模式

interface ISequencerFactory
{
  ISequencer GetSequencer(ISequencerOptions someOptions)
}

所以在您的代码中注入ISequencerFactory,然后使用一些选项(可能是stringenumType 等)来确定您需要哪个类

【讨论】:

  • 这是对我的一个坏问题的一个很好的解决方案 - 谢谢。 FWIW 我正在重新考虑这一点,以便在 SQL/存储过程中创建定序器,这可能比首先创建我自己的更安全。
  • 您确定第二次注册会覆盖第一次吗?我只是对此感到好奇。
  • @MohammedNoureldin 我想我过去测试过它。据我了解IServiceCollection 类存储映射interface &gt; realization。第二次添加接口将覆盖第一次映射。
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多