web-dev-qa-db-ja.com

.NET CoreでIServiceProviderのインスタンスを取得する方法は?

IServiceProviderは、単一のメソッドを持つインターフェースです。

object GetService(Type serviceType);

.NET CoreネイティブDIコンテナに登録されているタイプのインスタンスを作成するために使用されます。

IServiceProviderのインスタンスは、BuildServiceProviderIServiceCollectionメソッドを呼び出すことで取得できます。 IServiceCollectionは、ConfigureServicesクラスのStartupメソッドのパラメーターです。フレームワークによってIServiceCollectionのインスタンスで魔法のように呼び出されるようです。

IServiceProviderメソッドをまったく持たずにSetupのインスタンスを作成したい。統合テストアセンブリの依存関係を解決するために必要です。このシナリオでそれを取得することは可能ですか?

34
Landeeyo

これは、MicrosoftのIServiceCollectionのデフォルトの実装です。 https://github.com/aspnet/DependencyInjection/blob/master/src/DI/ServiceCollection.cs

コードを見ると、以下を呼び出すだけでIServiceCollectionを取得できるはずです。

var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection();

それが役立つことを願っています:)

18
user3151814

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));
38
Landeeyo