How to use Windsor IoC in ASP.net Core 2
Solution 1
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;
}
Solution 2
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
Solution 3
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 returnsIServiceProvider
instead ofvoid
.
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.
Related videos on Youtube
Yahya Hussein
Updated on September 15, 2022Comments
-
Yahya Hussein over 1 year
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.
-
Prageeth godage over 5 yearsI have done as your guild but came following error: Castle.MicroKernel.ComponentNotFoundException: 'No component for supporting the service Microsoft.AspNetCore.Hosting.Internal.WebHostOptions was found'
-
Prageeth godage over 5 yearsAnd I wanted to know where the controller injections comes to play ?