6

StructureMap을 사용하여 MVC 프로젝트의 setter/property 주입을 설정하려고하지만 속성을 설정하지 못했습니다. 나는 Constructor injection이 권장되는 방법이라는 것을 잘 알고 있지만 setter injection을 사용하는 것을 요구하는 엄격한 요구 사항을 가지고있다. StructureMap Setter 주입 설정하지 않음 속성

나는 그런 내에서 Global.asax에 다음과 같은 일반 보일러 설치 코드가

내 TestControllerFactory의 모습
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>(); 
      }); 

     }); 

다음

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

나는 다음과 같은 서비스/구현 클래스 쌍을

public interface IPaymentService 
{ 

} 

public class PaymentService:IPaymentService 
{ 

} 

마지막으로, {; 세트;}

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

공공 IPaymentService 서비스 {얻을}

컨트롤러 :

공용 클래스 HomeController : 난 그것으로 주입 된 콘크리트 결제 서비스 구현을 위해 필요한 속성이 위에 표시된, 디버깅 할 때 속성이 null로 유지됩니다.

또한 [SetterProperty]를 사용해 보았습니다. (컨트롤러를이 속성으로 연결하려는 의도가 없습니다.) 여전히 작동하지 않았습니다.

다른 조치가 필요한지 또는 문제가 무엇인지 알 수 없습니다. 나는 꽤 잠시 동안 StructureMap과 함께 생성자 주입을 사용 해왔다. 이 라인을 삭제

+0

당신이 세터 주입과 운이 있었나요를? 액션 필터를 시험 중입니다 만 작동하지 않는 것 같습니다. – ntombela

+0

세터 주입 작업에 어려움을 겪은 후 필자는 그 곳에서 벗어나기로 결정했다. – Joel

답변

3

봅니다 :

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

그것은 필요는 없습니다.

는 다음 컨트롤러를 감안할 때 :

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

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

이 있었다 속성 설정 StructureMap를 구성하는 데 필요한 된 모든 :

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

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

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

이 솔루션은 속성이 '컨트롤러'클래스에있는 경우에만 작동합니다. 제 경우에는 속성이 '컨트롤러가 아닌'클래스이므로 응답이 도움이되지 않습니다. –

+0

오브젝트 그래프의 모든 의존성을 가지고 StructureMap을 설정했다면 별다른 차이를주지 않습니다. –

+0

내 컨트롤러에 'IUnitOfWork' 속성을 넣었습니다. 값을 가져 오지만, 다른 클래스'MyServiceFactory'에 넣었을 때 컨트롤러에'MyServiceFactory' 클래스를 인스턴스화 할 때'IUnitOfWork' 속성은'null'입니다. –