Как использовать Windsor IoC в ASP.net Core 2

Как я могу использовать Castle Windsor в качестве IOC вместо контейнера IOC по умолчанию .net core?

Я создал служебный преобразователь, который зависит от 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();
    }
}

Невозможно выяснить, как использовать мой API-интерфейс .net core 2 для использования этого резольвера в качестве замены для IServiceCollection.

Ответ 1

Для других Ссылка В дополнение к решению, предоставленному Nkosi.

Существует пакет nuget с именем Castle.Windsor.MsDependencyInjection, который предоставит вам следующий метод:

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

и при запуске...

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

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

Ответ 2

Для ядра .net, которое IServiceProvider DI вокруг IServiceProvider, вам нужно создать собственную оболочку

Ссылка: Введение в внедрение зависимостей в 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;
}

Во время выполнения ваш контейнер будет использоваться для разрешения типов и внедрения зависимостей.

Ответ 3

Существует официальная поддержка Castle Windsor для ASP.NET Core, которая была выпущена как версия 5 (получите ее от nuget Castle.Windsor, Castle.Facilities.AspNetCore). Документация по его использованию здесь.

Больше информации в смежных вопросах здесь и здесь

Ответ 4

Я хотел добавить этот ответ, и Яхья Хуссейн предлагает мне работы, однако мне пришлось настраивать свою область в соответствии с LifestyleCustome<MsScopedLifestyleManager>() для каждой зарегистрированной зависимости.

Для некоторых это может быть второй натурой, но мне потребовалась минута, чтобы понять.