6

Estoy intentando configurar la inyección de setter/property para mi proyecto MVC usando StructureMap, pero parece que no puedo configurarlo para establecer las propiedades. Soy consciente de que la inyección de Constructor es la práctica recomendada, pero tengo un requisito estricto que exige que lo hagamos mediante la inyección de setter, por lo tanto, espere que los comentarios intenten decirme lo contrario.StructureMap Setter Injection no establece la propiedad

Tengo el código normal de instalación repetitivo como el siguiente en mi Global.asax

ControllerBuilder.Current.SetControllerFactory(new TestControllerFactory()); 

ObjectFactory.Initialize(x => { 
      x.For<IPaymentService>().Use<PaymentService>(); 
      x.ForConcreteType<HomeController>().Configure.Setter<IPaymentService>(y => y.PaymentService).IsTheDefault(); 
      x.SetAllProperties(y => 
      { 
       y.OfType<IPaymentService>(); 
      }); 

     }); 

Mi TestControllerFactory tiene el siguiente aspecto:

public class TestControllerFactory:System.Web.Mvc.DefaultControllerFactory 
{ 
    protected IController GetControllerInstance(Type controllerType) 
    { 
     if (controllerType == null) 
      throw new ArgumentNullException("controllerType"); 
     return ObjectFactory.GetInstance(controllerType) as IController ; 
    } 
} 

Tengo el siguiente/Implementación par de clases de servicio

public interface IPaymentService 
{ 

} 

public class PaymentService:IPaymentService 
{ 

} 

Y finalmente, tengo mi controlador que wil l tiene la propiedad de que tiene que tener la implementación del servicio de pago de hormigón inyectado en ella:

HomeController pública de clase: Controlador { Servicio IPaymentService pública {get; set;}

public ActionResult Index(){ 
     var test = Service... //Service is Null 
} 

}

Mostrado arriba, la propiedad permanece nula cuando depuro.

Además, he intentado usar [SetterProperty] solo para ver si funcionó (no tengo intención de conectar mis controladores con esos atributos), y todavía no funcionó.

No estoy seguro si tengo que hacer algo más o cuál podría ser el problema. He estado usando la inyección de constructor con StructureMap por bastante tiempo.

+0

¿Tuvo suerte con inyección Setter? Intento utilizar Action Filters, pero parece que tampoco funciona. – ntombela

+0

Después de luchar para trabajar con la inyección setter, decidí alejarme de ella. – Joel

Respuesta

3

intente poner esta línea:

x.ForConcreteType<HomeController>().Configure 
    .Setter<IPaymentService>(y => y.PaymentService).IsTheDefault(); 

No debería ser necesario.

Dado el siguiente controlador:

public class HomeController : Controller 
{ 
    public IMsgService Service { get; set; } 

    public ActionResult Index() 
    { 
     return Content(Service.GetMessage()); 
    } 
} 

Esto era todo lo que se requiere para configurar StructureMap para establecer la propiedad:

ObjectFactory.Initialize(cfg => 
{ 
    cfg.For<IMsgService>().Use<MyMsgService>(); 

    cfg.SetAllProperties(prop => 
    { 
     prop.OfType<IMsgService>(); 
    }); 
}); 

ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
+0

Esta solución solo funciona si la propiedad está en una clase 'controller', en mi caso la propiedad es clase' no-controller' así que su respuesta no me ayudaría. –

+0

No debe hacer ninguna diferencia * siempre que haya configurado StructureMap con todas las dependencias en el gráfico de objetos. –

+0

Pongo mi propiedad 'IUnitOfWork' en mi controlador y obtiene el valor, pero cuando lo pongo en otra clase' MyServiceFactory' y crea una instancia de la clase 'MyServiceFactory' en mi controlador, la propiedad' IUnitOfWork' es 'null'. –

Cuestiones relacionadas