Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Windsor IoC in ASP.net Core 2

Tags:

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 resolve services.

Something like:

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

Can not figure out how to let my .net core 2 web API use this resolver as a replacement for IServiceCollection.

like image 469
Yahya Hussein Avatar asked Dec 06 '17 10:12

Yahya Hussein


2 Answers

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; } 
like image 187
Yahya Hussein Avatar answered Sep 17 '22 14:09

Yahya Hussein


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.

like image 20
Nkosi Avatar answered Sep 19 '22 14:09

Nkosi