Simple Injector, регистрирующий контроллеры вручную
-
20-12-2019 - |
Вопрос
Я пытаюсь реализовать внедрение зависимостей в свою архитектуру (MVC, DDD — модель домена, репозиторий).Моя архитектура включает ASP.NET Identity 2.0.
На данном этапе я не хочу, чтобы DI управлял какими-либо объектами Identity 2.0 (UserAdminController, RolesAdminController...).Я бы предпочел объекты безопасности за пределами DI.На данном этапе интеграция объектов Identity в DI выглядит очень сложной.Я внимательно посмотрел, делал ли это кто-нибудь уже, чтобы я мог прочитать и узнать, как это сделать.Я ничего не смог найти.(Нашел один пост, который был близок, но без разрешения).
В любом случае, я следил за реализацией Simple Injector MVC (см. стандартный код ниже) и пробовал много вещей, я считаю, что проблема заключается в том, что я вызываю РегистрацияMvcControllers.
Поправьте меня, если я ошибаюсь, но этот оператор выберет все контроллеры, в именах которых добавлено слово «контроллер».
Вопрос:Как я могу выбрать, какие контроллеры будут зарегистрированы в Simple Injector?(Это называется ручной регистрацией?)
Буду очень признателен за любую помощь, так как большую часть сегодняшнего дня я пытался разобраться во всем этом и перейти к следующему шагу, т.е.внедрить DI и создать экземпляры моих объектов.
...
...
...вызывается из Application_Start()
// Create a Simple Injector container
var container = new Container();
// Configure the container
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
// Verify the container's configuration
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
private static void InitializeContainer(Container container)
{
container.Register<MyService1>();
container.Register<IMyRepositoryA, MyRepositoryA>();
// Trying to include Identity into Simple Injector - please ignore
container.Register<IUserStore<ApplicationUser>>(() => new UserStore<ApplicationUser>(new ApplicationDbContext()));
}
Решение
А RegisterMvcControllers
зарегистрирует следующие типы:
- Тип должен быть общедоступным.
- Тип должен реализовывать
System.Web.Mvc.IController
- Тип не должен быть абстрактным.
- Тип не должен быть определением универсального типа.
- Его имя должно заканчиваться на «Контроллер».
Вы можете увидеть, что происходит здесь, в исходном коде.
А RegisterMvcControllers
вызовы метода расширения в SimpleInjectorMvcExtensions.GetControllerTypesToRegister
метод для получения списка контроллеров для регистрации.Вы можете вызвать этот метод самостоятельно, чтобы увидеть, что зарегистрировано следующим образом:
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly())
Поэтому вместо того, чтобы звонить RegisterMvcControllers
Вы можете зарегистрировать контроллеры самостоятельно, позвонив по телефону GetControllerTypesToRegister
метод:
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly());
foreach (var controllerType in registeredControllerTypes)
{
container.Register(controllerType, controllerType, Lifestyle.Transient);
}
Таким образом, вы можете отфильтровать любой контроллер, который хотите зарегистрировать вручную:
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly())
.Where(type => type.Name != "UserStore`1");
foreach (var controllerType in registeredControllerTypes)
{
container.Register(controllerType, controllerType, Lifestyle.Transient);
}
Другой вариант — переопределить регистрацию:
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Options.AllowOverridingRegistrations = true;
container.Register<IUserStore<ApplicationUser>>(
() => new UserStore<ApplicationUser>(new ApplicationDbContext()))
// Always set the option back to false ASAP to prevent configuration errors.
container.Options.AllowOverridingRegistrations = false;