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.
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;
}
Pour le noyau .net, qui centre DI autour du IServiceProvider
, vous devez créer votre propre wrapper
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 renvoieIServiceProvider
au lieu devoid
.
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.
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 .