6

Próbuję ustawić setter/property injection dla mojego projektu MVC przy użyciu StructureMap, ale nie mogę go ustawić w celu ustawienia właściwości. Doskonale zdaję sobie sprawę, że wstrzykiwanie preparatu Constructor jest zalecaną praktyką, ale mam ścisły wymóg, który wymaga, abyśmy robili to za pomocą zastrzyku ustawiającego, dlatego prosimy o komentarze, które próbują mi powiedzieć inaczej.StructureMap Setter Injection not setting property

mam normalną szablonowe kod konfiguracji, takie jak następujące w moim 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>(); 
      }); 

     }); 

Moja TestControllerFactory wygląda następująco:

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 ; 
    } 
} 

Mam następujące klasy usługi pair/Wdrażanie

public interface IPaymentService 
{ 

} 

public class PaymentService:IPaymentService 
{ 

} 

I wreszcie, mam kontrolera, który będzie l mają tę właściwość, że musi mieć konkretną realizację usług płatniczych wstrzykuje do niego:

public class HomeController: Kontroler { publicznego IPaymentService Usługa {get; set;}

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

}

Powyżej, właściwość pozostaje pusta po debugowaniu.

Dodatkowo, próbowałem używać [SetterProperty] tylko po to, aby sprawdzić, czy zadziałało (nie mam zamiaru sprzęgać moich kontrolerów z tymi atrybutami) i nadal nie działało.

Nie jestem pewien, czy muszę zrobić coś innego, czy może być problem. Od jakiegoś czasu korzystam z wtrysku konstruktora z StructureMap.

+0

miałeś szczęścia Seter z wtryskiem? Próbuję użyć Action Filters, ale to też nie działa. – ntombela

+0

Po walce z zastrzykiem ustawiającym postanowiłem odejść od tego. – Joel

Odpowiedz

3

Spróbuj upuszczenie tej linii:

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

To nie powinno być konieczne.

Biorąc pod uwagę następujące Kontroler:

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

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

To było wszystko, co było wymagane do skonfigurowania StructureMap ustawić właściwość:

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

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

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

To rozwiązanie działa tylko wtedy, gdy właściwość znajduje się w klasie "kontroler", w moim przypadku właściwość to klasa "kontroler", więc twoja odpowiedź nie pomogłaby mi. –

+0

Nie powinno to powodować żadnych różnic * pod warunkiem, że skonfigurowałeś StructureMap ze wszystkimi zależnościami na wykresie obiektu. –

+0

Umieściłem moją własność 'IUnitOfWork' w moim kontrolerze i otrzymuje ona wartość, ale kiedy umieszczę ją w innej klasie' MyServiceFactory' i utworzę klasę 'MyServiceFactory' w moim kontrolerze, właściwość' IUnitOfWork' ma wartość 'null'. –

Powiązane problemy