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

bxfogqkk  于 2023-01-18  发布在  .NET
关注(0)|答案(2)|浏览(2161)

我有一个ASP.NET核心项目(我的第一个项目),它需要两个内部“序列器”来完成特定任务。
在Startup.cs配置服务方法中:

services.AddSingleton<ISequencer, ProfileSequencer>();

当然我已经定义了接口和实现,它运行得很好,但是我不知道如何添加第二个序列器,它实现了相同的接口,但有一个稍微不同的实现。

services.AddSingleton<ISequencer, ChargeSequencer>();

ASP.NET对此并没有抱怨,但是现在当我将ISequencer注入到我的类中时,我无法想象它如何知道使用哪个单例。我怀疑(但不确定)第二个单例有效地替换了第一个单例。
这里可能有一些糟糕的设计决策,所以我将接受一个描述如何注入实现相同接口的两个不同单例的答案,或者如果必要的话,另一个解决这个问题的合理方法。

6vl6ewon

6vl6ewon1#

很抱歉回答得太晚,但是您可以将IEnumerable<ISequencer>注入到类或控制器中,服务定位器将传递该接口下的所有注册服务

798qvoo8

798qvoo82#

注册同一接口的两个服务是不可能的-第二个注册会覆盖第一个。但是我建议你快速解决你的问题:
1)创建嵌套接口并将其用于注册:

ISomeSpecificSequencer : ISequencer {}
IOtherSpecificSequencer : ISequencer {}

2)使用工厂模式

interface ISequencerFactory
{
  ISequencer GetSequencer(ISequencerOptions someOptions)
}

因此,在代码中注入ISequencerFactory,然后使用某个选项(可以是stringenumType等)来确定需要哪个类

相关问题