IServiceProvider
は、単一のメソッドを持つインターフェースです。
object GetService(Type serviceType);
.NET CoreネイティブDIコンテナに登録されているタイプのインスタンスを作成するために使用されます。
IServiceProvider
のインスタンスは、BuildServiceProvider
のIServiceCollection
メソッドを呼び出すことで取得できます。 IServiceCollection
は、ConfigureServices
クラスのStartup
メソッドのパラメーターです。フレームワークによってIServiceCollection
のインスタンスで魔法のように呼び出されるようです。
IServiceProvider
メソッドをまったく持たずにSetup
のインスタンスを作成したい。統合テストアセンブリの依存関係を解決するために必要です。このシナリオでそれを取得することは可能ですか?
これは、MicrosoftのIServiceCollection
のデフォルトの実装です。 https://github.com/aspnet/DependencyInjection/blob/master/src/DI/ServiceCollection.cs
コードを見ると、以下を呼び出すだけでIServiceCollection
を取得できるはずです。
var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection();
それが役立つことを願っています:)
goatyで述べたように、新しいServiceCollection
を作成するだけで十分です。 .NET CoreのDIコンテナにアクセスするために使用できるサンプルクラスを次に示します。
public static class ServiceProviderFactory
{
public static IServiceProvider ServiceProvider { get; }
static ServiceProviderFactory()
{
HostingEnvironment env = new HostingEnvironment();
env.ContentRootPath = Directory.GetCurrentDirectory();
env.EnvironmentName = "Development";
Startup startup = new Startup(env);
ServiceCollection sc = new ServiceCollection();
startup.ConfigureServices(sc);
ServiceProvider = sc.BuildServiceProvider();
}
}
Startup
クラスはテスト済みプロジェクトから取得されるため、サービス登録を繰り返す必要はありません。
次に、テストクラスで次を使用します。
var foo = ServiceProviderFactory.ServiceProvider.GetServices(typeof(IFoo));