当社の開発プロセスでは、サービス、我々は一般的な定義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