Как использовать Windsor IoC в ASP.net Core 2
Как я могу использовать Castle Windsor в качестве IOC вместо контейнера IOC по умолчанию .net core?
Я создал служебный преобразователь, который зависит от WindsorContainer
для разрешения служб.
Что-то вроде:
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();
}
}
Невозможно выяснить, как использовать мой API-интерфейс .net core 2 для использования этого резольвера в качестве замены для IServiceCollection.
Ответы
Ответ 1
Для других Ссылка В дополнение к решению, предоставленному Nkosi.
Существует пакет nuget с именем Castle.Windsor.MsDependencyInjection, который предоставит вам следующий метод:
WindsorRegistrationHelper.CreateServiceProvider(WindsorContainer,IServiceCollection);
Какой тип возвращаемого значения - IServiceProvider
, и вам не нужно создавать собственную оболочку.
Таким образом, решение будет выглядеть так:
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;
}
}
и при запуске...
public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddMvc();
// Add other framework services
// Add custom provider
var container = new ServiceResolver(services).GetServiceProvider();
return container;
}
Ответ 2
Для ядра .net, которое IServiceProvider
DI вокруг IServiceProvider
, вам нужно создать собственную оболочку
Ссылка: Введение в внедрение зависимостей в ASP.NET Core: Замена контейнера служб по умолчанию
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);
}
//...
}
а затем настройте контейнер в ConfigureServices
и верните IServiceProvider
:
При использовании стороннего DI-контейнера необходимо изменить ConfigureServices
чтобы он возвращал IServiceProvider
вместо void
.
public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddMvc();
// Add other framework services
// Add custom provider
var container = new ServiceResolver(services);
return container;
}
Во время выполнения ваш контейнер будет использоваться для разрешения типов и внедрения зависимостей.
Ответ 3
Существует официальная поддержка Castle Windsor для ASP.NET Core, которая была выпущена как версия 5 (получите ее от nuget Castle.Windsor, Castle.Facilities.AspNetCore). Документация по его использованию здесь.
Больше информации в смежных вопросах здесь и здесь
Ответ 4
Я хотел добавить этот ответ, и Яхья Хуссейн предлагает мне работы, однако мне пришлось настраивать свою область в соответствии с LifestyleCustome<MsScopedLifestyleManager>()
для каждой зарегистрированной зависимости.
Для некоторых это может быть второй натурой, но мне потребовалась минута, чтобы понять.