Pergunta

Estou tentando implementar Injeção de Dependência em minha arquitetura (MVC, DDD - Modelo de Domínio, Repositório).E minha arquitetura inclui o ASP.NET Identity 2.0.

Neste estágio, não quero que o DI controle nenhum dos objetos do Identity 2.0 (UserAdminController, RolesAdminController...).Eu preferiria os objetos de segurança fora do DI.Nesta fase, a integração dos objetos de identidade no DI parece muito difícil.Dei uma boa olhada para ver se alguém já fez isso, para poder ler e aprender como fazer.Não consegui encontrar nada.(Encontrei uma postagem que chegou perto, mas sem resolução).

De qualquer forma, segui a implementação do Simple Injector MVC (veja o código padrão abaixo), e tentando muitas coisas, acredito que o problema esteja em eu chamar RegistrarMvcControllers.

Corrija-me se estiver errado, mas esta afirmação irá captar todos os controladores com seus nomes pós-fixados com "controlador".

Pergunta:Como posso selecionar quais controladores serão registrados no Simple Injector?(Isso é chamado de registro manual?)

Qualquer ajuda seria muito apreciada, já que passei a maior parte do dia tentando entender tudo isso e prosseguir para a próxima etapa, ou seja,tenho DI implementado e instanciando meus objetos.

...

...

...chamado de 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()));
    }
Foi útil?

Solução

O RegisterMvcControllers registrará os seguintes tipos:

  • O tipo deve ser público
  • O tipo deve implementar System.Web.Mvc.IController
  • O tipo não deve ser abstrato
  • O tipo não deve ser uma definição de tipo genérica
  • Seu nome deve terminar com “Controller”

Você pode ver o que acontece aqui no código fonte.

O RegisterMvcControllers chamadas de método de extensão para o SimpleInjectorMvcExtensions.GetControllerTypesToRegister método para obter a lista de controladores a serem registrados.Você mesmo pode chamar esse método para ver o que está registrado da seguinte maneira:

var registeredControllerTypes =
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())

Então, em vez de ligar RegisterMvcControllers você mesmo pode registrar os controladores ligando para o GetControllerTypesToRegister método:

var registeredControllerTypes = 
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly());

foreach (var controllerType in registeredControllerTypes)
{
    container.Register(controllerType, controllerType, Lifestyle.Transient);
}

Desta forma você pode filtrar qualquer controlador que deseja registrar manualmente:

var registeredControllerTypes = 
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())
    .Where(type => type.Name != "UserStore`1");

foreach (var controllerType in registeredControllerTypes)
{
    container.Register(controllerType, controllerType, Lifestyle.Transient);
}

Outra opção é substituir o registro:

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top