5

Trabajé un poco con StructureMap y logré inyectar en mi controlador (mediante inyección de constructor) un repositorio de tipo concreto para una interfaz.Inyectar en un proveedor de membresía personalizado con StructureMap

Ahora, necesito insertar un tipo de repositorio en mi proveedor de membresía personalizado. ¿Pero cómo? Mi proveedor de membresía personalizado se crea a través del Membership.Provider.ValidateUser (por ejemplo).

Por controlador de E creado una clase como esta:

public class IocControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(
     System.Web.Routing.RequestContext requestContext, 
     Type controllerType) 
    { 
     return (Controller) 
      ObjectFactory.GetInstance(controllerType); 
    } 
} 

y en Global.asax, en Application_Start():

//... 
ObjectFactory.Initialize(x => 
{ 
    x.AddRegistry(new ArticleRegistry()); 
} 
            ); 


ControllerBuilder.Current.SetControllerFactory(
    new IocControllerFactory()); 
//... 

Pero, ¿cómo inyectar un tipo concreto en mi proveedor de suscripciones personalizado con StructureMap?

+0

posible duplicado de [Inyección de propiedad en el proveedor de membresía personalizado utilizando Castle] (http://stackoverflow.com/questions/10174636/property-injection-in-custom-membership-provider-using-castle) – Steven

Respuesta

3

No hay forma de inyectar en este caso, creo.

La inyección solo funciona cuando la "fábrica" ​​crea las instancias requeridas, sabe acerca de la inyección y el área del proveedor de membresía desafortunadamente muestra su edad. Fue codificado cuando las cosas se hicieron de manera diferente :).

Si está utilizando el proveedor de suscripciones personalizado con ASP.NET MVC (versión 2 +), se puede obtener lo que necesita solicitarla a la DependencyResolver así:

DependencyResolver.Current.GetService<IRepository<User>>(); 

o usted podría probablemente usa ObjectFactory directamente.

+0

No entiendo. Lo uso en mi proveedor de membresía personalizado y no escribo nada en Global.asax, en Application_Start()? – Blocked

+0

No, aún necesita agregar su Resolutor de dependencias personalizado en Application_Start() o en una clase de tipo de arranque como DependencyResolver.SetResolver (nuevo StructureMapDependencyResolver (contenedor)); donde StructureMapDependencyResolver es su clase personalizada y contenedor es su StructureMap IContainer. más información aquí: http://ericsowell.com/blog/2011/1/20/structuremap-and-asp-net-mvc-3-getting-started – stephenbayer

Cuestiones relacionadas