Wie kann ich Castle Windsor als IOC anstelle des Standardcontainers .net core IOC) verwenden?
Ich habe einen Service-Resolver erstellt, der von WindsorContainer
zum Auflösen von Diensten abhängt.
Etwas wie:
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();
}
}
Ich kann nicht herausfinden, wie ich die .net Core 2-Web-API diesen Resolver als Ersatz für IServiceCollection verwenden kann.
Für andere Referenz zusätzlich zur Lösung Nkosi zur Verfügung gestellt.
Es gibt ein Nuget-Paket mit dem Namen Castle.Windsor.MsDependencyInjection , mit dem Sie die folgende Methode erhalten:
WindsorRegistrationHelper.CreateServiceProvider(WindsorContainer,IServiceCollection);
Der zurückgegebene Typ ist IServiceProvider
und Sie müssen keinen eigenen Wrapper erstellen.
Die Lösung lautet also:
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;
}
}
und in Startup ...
public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddMvc();
// Add other framework services
// Add custom provider
var container = new ServiceResolver(services).GetServiceProvider();
return container;
}
Für .NET Core, bei dem DI um das IServiceProvider
zentriert ist, müssten Sie einen eigenen Wrapper erstellen
Referenz: Einführung in die Abhängigkeitsinjektion in ASP.NET Core: Ersetzen des Standarddienstecontainers
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);
}
//...
}
und konfigurieren Sie dann den Container in ConfigureServices
und geben Sie ein IServiceProvider
zurück:
Wenn Sie einen DI-Container eines Drittanbieters verwenden, müssen Sie
ConfigureServices
so ändern, dassIServiceProvider
anstelle vonvoid
zurückgegeben wird.
public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddMvc();
// Add other framework services
// Add custom provider
var container = new ServiceResolver(services);
return container;
}
Zur Laufzeit wird Ihr Container verwendet, um Typen aufzulösen und Abhängigkeiten einzufügen.
Es gibt eine offizielle Castle Windsor-Unterstützung für ASP.NET Core, die als Version 5 veröffentlicht wurde (beziehen Sie sie von nuget Castle.Windsor , Castle.Facilities.AspNetCore ). Die Dokumentation, wie man es benutzt, ist hier .