wake-up-neo.com

Verwendung von Windsor IoC in ASP.net Core 2

Wie kann ich Castle Windsor als IOC anstelle des Standardcontainers .net core IOC) verwenden?

Ich habe einen Service-Resolver erstellt, der von WindsorContainer zum Auflösen von Diensten abhängt.

Etwas wie:

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();
    }
}

Ich kann nicht herausfinden, wie ich die .net Core 2-Web-API diesen Resolver als Ersatz für IServiceCollection verwenden kann.

18
Yahya Hussein

Für andere Referenz zusätzlich zur Lösung Nkosi zur Verfügung gestellt.

Es gibt ein Nuget-Paket mit dem Namen Castle.Windsor.MsDependencyInjection , mit dem Sie die folgende Methode erhalten:

WindsorRegistrationHelper.CreateServiceProvider(WindsorContainer,IServiceCollection);

Der zurückgegebene Typ ist IServiceProvider und Sie müssen keinen eigenen Wrapper erstellen.

Die Lösung lautet also:

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;
    }    
}

und in Startup ...

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

Für .NET Core, bei dem DI um das IServiceProvider zentriert ist, müssten Sie einen eigenen Wrapper erstellen

Referenz: Einführung in die Abhängigkeitsinjektion in ASP.NET Core: Ersetzen des Standarddienstecontainers

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);
    }

    //...
}

und konfigurieren Sie dann den Container in ConfigureServices und geben Sie ein IServiceProvider zurück:

Wenn Sie einen DI-Container eines Drittanbieters verwenden, müssen Sie ConfigureServices so ändern, dass IServiceProvider anstelle von void zurückgegeben wird.

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

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

Zur Laufzeit wird Ihr Container verwendet, um Typen aufzulösen und Abhängigkeiten einzufügen.

10
Nkosi

Es gibt eine offizielle Castle Windsor-Unterstützung für ASP.NET Core, die als Version 5 veröffentlicht wurde (beziehen Sie sie von nuget Castle.Windsor , Castle.Facilities.AspNetCore ). Die Dokumentation, wie man es benutzt, ist hier .

Mehr Infos in den dazugehörigen Ausgaben hier und hier

9
xhafan