创建两个实现相同接口的单例服务

时间:2017-04-21 10:30:54

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

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

在Startup.cs ConfigureServices方法中:

services.AddSingleton<ISequencer, ProfileSequencer>();

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

services.AddSingleton<ISequencer, ChargeSequencer>();

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

这里可能有一些不好的设计决定,所以我会接受一个答案,描述我如何注入两个实现相同界面的不同单例,或者如果有必要另一个合理的方法来解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

ISomeSpecificSequencer : ISequencer {}
IOtherSpecificSequencer : ISequencer {}

2)使用工厂模式

interface ISequencerFactory
{
  ISequencer GetSequencer(ISequencerOptions someOptions)
}

因此,在您的代码中,您注入ISequencerFactory,然后使用某个选项(可能是stringenumType等)来确定您需要的类< / p>