Pregunta

Estoy intentando implementar la inyección de dependencia en mi arquitectura (MVC, DDD - Modelo de dominio, Repositorio).Y mi arquitectura incluye ASP.NET Identity 2.0.

En esta etapa, no quiero que DI controle ninguno de los objetos de Identity 2.0 (UserAdminController, RolesAdminController...).Preferiría los objetos de seguridad fuera de DI.En esta etapa, integrar los objetos de identidad en DI parece muy difícil.Eché un buen vistazo para ver si alguien ya había hecho esto, para poder leer y aprender cómo hacerlo.No pude encontrar nada.(Encontré una publicación que estuvo cerca, pero sin resolución).

De todos modos, seguí la implementación de Simple Injector MVC (consulte el código estándar a continuación) y probé muchas cosas, creo que el problema radica en que llamo RegistrarseMvcControladores.

Corríjame si me equivoco, pero esta declaración seleccionará todos los controladores con su nombre prefijado con "controlador".

Pregunta:¿Cómo puedo seleccionar qué controladores se registran con Simple Injector?(¿A esto se le llama registrarse manualmente?)

Cualquier ayuda sería muy apreciada, ya que he pasado la mayor parte del día tratando de entender todo esto y continuar con el siguiente paso, es decir.He implementado DI y he creado instancias de mis objetos.

...

...

...llamado desde 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()));
    }
¿Fue útil?

Solución

El RegisterMvcControllers registrará los siguientes tipos:

  • El tipo debe ser público.
  • El tipo debe implementar System.Web.Mvc.IController
  • El tipo no debe ser abstracto.
  • El tipo no debe ser una definición de tipo genérica.
  • Su nombre debe terminar en "Controlador"

Puedes ver lo que pasa aquí en el código fuente.

El RegisterMvcControllers llamadas al método de extensión en el SimpleInjectorMvcExtensions.GetControllerTypesToRegister Método para obtener la lista de controladores a registrar.Puede llamar a ese método usted mismo para ver qué está registrado de la siguiente manera:

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

Así que en lugar de llamar RegisterMvcControllers Puede registrar los controladores usted mismo llamando al GetControllerTypesToRegister método:

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

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

De esta manera puedes filtrar cualquier controlador que quieras 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);
}

Otra opción es anular el 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top