2017-04-21 137 views
2

我有一個ASP.NET核心項目(我第一次),需要爲特定任務兩個內部「序」兩個單服務。首先是實施這樣的:創建實現相同的接口

在Startup.cs ConfigureServices方法:

services.AddSingleton<ISequencer, ProfileSequencer>(); 

當然,我有接口和實現定義的,它的工作好。不過,我不知道如何添加第二個音序器,它實現相同的接口,但具有稍微不同的實現。

services.AddSingleton<ISequencer, ChargeSequencer>(); 

ASP.NET不會抱怨這個,但現在當我注入ISequencer到我的班,我無法想象它是如何知道要使用的單。我懷疑(但不確定)第二個單例實際上取代了第一個單例。

有可能是這裏的一些不好的設計決策,所以我會接受它描述我怎麼能注入實現了相同的接口,或者如果需要其他合理的方法解決這個問題兩個不同的單身人士一個答案。謝謝!

+1

http://stackoverflow.com/questions/39174989/how-to-register-multiple-implementations-of-the-same-interface-in-asp-net-core的可能重複 –

+0

感謝您的聯繫 - 我同意這個基本上是重複的。由於我發現了針對不同服務類型的其他解決方案,因此我在單例實現方面的搜索條件中掛了。 – k3davis

回答

0

這是不可能註冊相同接口的兩個服務 - 第二註冊將首先覆蓋。但我建議你你的問題的快速解決方案:)

ISomeSpecificSequencer : ISequencer {} 
IOtherSpecificSequencer : ISequencer {} 

2使用工廠模式

interface ISequencerFactory 
{ 
    ISequencer GetSequencer(ISequencerOptions someOptions) 
} 
在你的代碼

所以你注入:

1)創建嵌套的接口,並將其用於註冊ISequencerFactory然後使用一些選項(它可能是string,enum,Type等)來確定您需要哪個類

+0

這對我來說是一個很好的解決方案 - 謝謝。 FWIW我正在重新考慮這個問題,以便在SQL /存儲過程中創建順序器,這可能比首先創建自己的程序更安全。 – k3davis

+0

你確定第二次註冊會覆蓋第一次嗎?我只是好奇而已。 –

+0

@MohammedNoureldin我想我過去測試過它。據我瞭解'IServiceCollection'類商店映射'接口>實現'。第二次添加接口將覆蓋第一個映射。 –