web-dev-qa-db-ja.com

ASP.net Core 2でWindsor IoCを使用する方法

Castle Windsorをデフォルトの.netコアIOCコンテナの代わりにIOCとして使用するにはどうすればよいですか?

サービスを解決するためにWindsorContainerに依存するサービスリゾルバーを構築しました。

何かのようなもの:

public class ServiceResolver
{
    private static WindsorContainer container;
    public ServiceResolver()
    {
        container = new WindsorContainer();
        // a method to register components in container
        RegisterComponents(container);
    }

    public IList<T> ResolveAll<T>()
    {
        return container.ResolveAll<T>().ToList();
    }
}

私の.netコア2 Web APIがこのリゾルバーをIServiceCollectionの代わりとして使用する方法を理解できません。

18
Yahya Hussein

Nkosiが提供したソリューションに加えて、その他の参考資料。

Castle.Windsor.MsDependencyInjection と呼ばれるnugetパッケージがあり、次のメソッドを提供します。

WindsorRegistrationHelper.CreateServiceProvider(WindsorContainer,IServiceCollection);

返される型はIServiceProviderであり、独自のラッパーを作成する必要はありません。

そのため、ソリューションは次のようになります。

public class ServiceResolver{    
    private static WindsorContainer container;
    private static IServiceProvider serviceProvider;

    public ServiceResolver(IServiceCollection services) {
        container = new WindsorContainer();
        //Register your components in container
        //then
        serviceProvider = WindsorRegistrationHelper.CreateServiceProvider(container, services);
    }

    public IServiceProvider GetServiceProvider() {
        return serviceProvider;
    }    
}

and inStartup...

public IServiceProvider ConfigureServices(IServiceCollection services) {
    services.AddMvc();
    // Add other framework services

    // Add custom provider
    var container = new ServiceResolver(services).GetServiceProvider();
    return container;
}
14
Yahya Hussein

IServiceProviderを中心にDIを配置する.netコアの場合、独自のラッパーを作成する必要があります。

参照: ASP.NET Coreの依存性注入の概要:デフォルトサービスコンテナーの置き換え

public class ServiceResolver : IServiceProvider {
    private static WindsorContainer container;

    public ServiceResolver(IServiceCollection services) {
        container = new WindsorContainer();
        // a method to register components in container
        RegisterComponents(container, services);
    }

    public object GetService(Type serviceType) {
        return container.Resolve(serviceType);
    }

    //...
}

ConfigureServicesでコンテナを構成し、IServiceProviderを返します。

サードパーティのDIコンテナを使用する場合、ConfigureServicesの代わりにIServiceProviderを返すようにvoidを変更する必要があります。

public IServiceProvider ConfigureServices(IServiceCollection services) {
    services.AddMvc();
    // Add other framework services

    // Add custom provider
    var container = new ServiceResolver(services);
    return container;
}

実行時に、コンテナを使用して型を解決し、依存関係を注入します。

10
Nkosi

バージョン5としてリリースされたASP.NET Coreの公式のCastle Windsorサポートがあります(nuget Castle.WindsorCastle.Facilities.AspNetCore から入手してください)。使用方法のドキュメントは here です。

関連する問題の詳細 here および here

9
xhafan