道の下に注入された注入する方法(いろいろな意味で)デフォルトASP.NETコア複数の実装 - スカイニンジン星 - CSDNのブログ

オリジナル: -スカイニンジン星を- (いろいろな意味で)複数の実装を注入する方法ASP.NETコアデフォルト注入法CSDNブログ

免責事項:この記事は、元の記事をstarfd再現され、ソースを明記してください。https://blog.csdn.net/starfd/article/details/81282651

当社の開発プロセスでは、サービス、我々は一般的な定義interface実現は、(一部の人々は、このケースがあると言うのだけ具体的な実現が存在している第十世代のシングルパスモードが)、この時間は、Coreデフォルトの注入方法は、私たちのニーズをサポートすることであったが、1にしています懸念している実感これらの抽象的な定義は、我々はプロジェクト内の特定の実装のさまざまなを持っていることが、我々は特定のニーズに応じて異なる実装を選択することができます。

まず、私たちのビジネスシナリオの第1の具体例の下で、我々は以下と仮定interfaceし、その2つの具体的な実現を

    public interface ILogicService
    {
        int GetNo();
    }

    public class LogicSericeImpt1 : ILogicService
    {
        public int GetNo()
        {
            return 1;
        }
    }
    public class LogicSericeImpt2 : ILogicService
    {
        public int GetNo()
        {
            return 2;
        }
    }
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

例は、実装が異なる数、注射の場合に異なる実装を取得する方法の以下の用語を返す異なり、非常に単純です。

直接注入IServiceProvider方法の


コア内部のなので、IServiceProvider中の特定のアプリケーションに直接注入することが許可されているので、直接はでありIServiceProvider達成するための具体的な方法を取得します。

1. GetService

まず、具体的な実装を注入

services.AddTransient<LogicSericeImpt1>();
services.AddTransient<LogicSericeImpt2>();
    
    
  • 1
  • 2

そして、次のように具体化コンストラクタを取得

public TodoController(IServiceProvider serviceProvider)
{
    var s1FromProvider = serviceProvider.GetService<LogicSericeImpt1>();
    var s2FromProvider = serviceProvider.GetService<LogicSericeImpt2>();
}
    
    
  • 1
  • 2
  • 3
  • 4
  • 5

2. GetServices方法

最初の注射interfaceと実現

services.AddTransient<ILogicService, LogicSericeImpt1>();
services.AddTransient<ILogicService, LogicSericeImpt2>();
    
    
  • 1
  • 2

そして、次のように具体化コンストラクタを取得

public TodoController(IServiceProvider serviceProvider)
{
    var logicAllRegs = serviceProvider.GetServices<ILogicService>().ToList();
    var s1FromAllRegs = logicAllRegs[0];
    var s2FromAllRegs = logicAllRegs[1];
}
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

直接注入モード設定


このように実際の噴射除去されIServiceProvider、直接、プロセスGetServices得られた結果を注入します。最初の注射interfaceと実現

services.AddTransient<ILogicService, LogicSericeImpt1>();
services.AddTransient<ILogicService, LogicSericeImpt2>();
    
    
  • 1
  • 2

そして、次のように具体化コンストラクタを取得

public TodoController(IEnumerable<ILogicService> services)
{
    var s1FromServices = services.First();
    var s2FromServices = services.Skip(1).First();
}
    
    
  • 1
  • 2
  • 3
  • 4
  • 5

直接注入Funcファクトリーモード


このように、我々は、具体的な実現に直接注入が、注入されないFuncようにファクトリの実装を。まず、具体的な実装を注入する必要があります

services.AddTransient<LogicSericeImpt1>();
services.AddTransient<LogicSericeImpt2>();
    
    
  • 1
  • 2

その後、我々は我々が押してこの植物、のFuncを注入し続けてint異なる実装を返しますが、もちろん、あなたには、また、他の手段を使用することができますstring

services.AddSingleton(provider =>
{
    Func<int, ILogicService> func = n =>
    {
        switch (n)
        {
            case 1:
                return provider.GetService<LogicSericeImpt1>();
            case 2:
                return provider.GetService<LogicSericeImpt2>();
            default:
                throw new NotSupportedException();
        }
    };
    return func;
});
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

そして、次のように具体化コンストラクタを取得

public TodoController(Func<int, ILogicService> funcFactory)
{
    var s1FromFunc = funcFactory(1);
    var s2FromFunc = funcFactory(2);
}
    
    
  • 1
  • 2
  • 3
  • 4
  • 5

おすすめ

転載: www.cnblogs.com/lonelyxmas/p/10936998.html