Simple Injector registrando controladores manualmente
-
20-12-2019 - |
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()));
}
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;