web-dev-qa-db-fra.com

Comment utiliser Windsor IoC dans ASP.net Core 2

Comment puis-je utiliser Castle Windsor comme un IOC au lieu du noyau .net par défaut IOC conteneur?)

J'ai créé un résolveur de service qui dépend de WindsorContainer pour résoudre les services.

Quelque chose comme:

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

Impossible de comprendre comment laisser mon API web .net core 2 utiliser ce résolveur en remplacement de IServiceCollection.

18
Yahya Hussein

Pour les autres Référence En plus de la solution fournie par Nkosi.

Il existe un paquet de pépites appelé Castle.Windsor.MsDependencyInjection qui vous fournira la méthode suivante:

WindsorRegistrationHelper.CreateServiceProvider(WindsorContainer,IServiceCollection);

Le type retourné est IServiceProvider et vous n'aurez pas besoin de créer votre propre wrapper.

La solution sera donc comme:

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

et dans Démarrage ...

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

Pour le noyau .net, qui centre DI autour du IServiceProvider, vous devez créer votre propre wrapper

Référence: Introduction à l'injection de dépendances dans ASP.NET Core: remplacement du conteneur de services par défaut

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

    //...
}

puis configurez le conteneur dans ConfigureServices et retournez un IServiceProvider:

Lorsque vous utilisez un conteneur DI tiers, vous devez modifier ConfigureServices pour qu'il renvoie IServiceProvider au lieu de void.

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

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

Au moment de l'exécution, votre conteneur sera utilisé pour résoudre les types et injecter des dépendances.

10
Nkosi

Il existe un support officiel de Castle Windsor pour ASP.NET Core qui a été publié en version 5 (obtenez-le de nuget Castle.Windsor , Castle.Facilities.AspNetCore ). La documentation sur son utilisation est ici .

Plus d'informations sur les problèmes connexes ici et ici

9
xhafan