Вопрос

Я пытаюсь реализовать внедрение зависимостей в свою архитектуру (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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top