How to use Windsor IoC in ASP.net Core 2

前端 未结 4 1086
甜味超标
甜味超标 2021-01-31 19:00

How can I use Castle Windsor as an IOC instead of the default .net core IOC container?

I have built a service resolver that depends on WindsorContainer to r

相关标签:
4条回答
  • 2021-01-31 19:20

    There is an official Castle Windsor support for ASP.NET Core which has been released as version 5 (get it from nuget Castle.Windsor, Castle.Facilities.AspNetCore). The documentation how to use it is here.

    More info in the related issues here and here

    0 讨论(0)
  • 2021-01-31 19:23

    For .net core, which centers DI around the IServiceProvider, you would need to create you own wrapper

    Reference : Introduction to Dependency Injection in ASP.NET Core: Replacing the default services container

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

    and then configure the container in ConfigureServices and return an IServiceProvider:

    When using a third-party DI container, you must change ConfigureServices so that it returns IServiceProvider instead of void.

    public IServiceProvider ConfigureServices(IServiceCollection services) {
        services.AddMvc();
        // Add other framework services
    
        // Add custom provider
        var container = new ServiceResolver(services);
        return container;
    }
    

    At runtime, your container will be used to resolve types and inject dependencies.

    0 讨论(0)
  • 2021-01-31 19:27

    For others Reference In addition to the solution Nkosi provided.

    There is a nuget package called Castle.Windsor.MsDependencyInjection that will provide you with the following method:

    WindsorRegistrationHelper.CreateServiceProvider(WindsorContainer,IServiceCollection);
    

    Which's returned type is IServiceProvider and you will not need to create you own wrapper.

    So the solution will be like:

    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 in Startup...

    public IServiceProvider ConfigureServices(IServiceCollection services) {
        services.AddMvc();
        // Add other framework services
    
        // Add custom provider
        var container = new ServiceResolver(services).GetServiceProvider();
        return container;
    }
    
    0 讨论(0)
  • 2021-01-31 19:43

    I wanted to add that answer Yahya Hussein offers works for me, however I had to adjust my scope to LifestyleCustome<MsScopedLifestyleManager>() on each dependency I registered.

    This may be second nature to some but it took me a minute to figure out.

    0 讨论(0)
提交回复
热议问题