2

캐슬 윈저를 처음 접했고 최신 버전을 사용 중입니다. 잘 작동하는 리포지토리에 대한 항목을 만들었지 만 컨트롤러에 전달할 최종 종속성이 하나 있습니다.캐슬 윈저에서 IValidationDictionary에 대한 IOC

IValidationDictionary에서 상속받은 ModelStateWrapper를 만들었습니다.

var v = new Mock<ModelStateDictionary>(); 
_validationService = new ModelStateWrapper(v.Object); 
_service = new MembershipService(_validationService); 

내가 할 수있는 ': 다음이 사용 MOQ을 할 수있는 내 테스트에서

IMembershipService _memSvc; 
IValidationDictionary _validationService; 

public AccountController() 
{ 
    _validationService = new ModelStateWrapper(this.ModelState); 
    _memSvc = new MembershipService(_validationService); 
} 

: 내 코드에서 나는 예를 들어 다음 통과 할 수 있도록 ModelStateWrapper 그것의 생성자에 ModelStateDictionary 소요 Castle이 ModelState를 ModelStateWrapper에 삽입하는 것으로 보입니다. 어디서 시작 해야할지 전혀 모르겠다. 단지 '무시하고'수동으로 삽입하려고 시도 할 수 없다. 성은 종속성을 검색하고 의존성이 남아 있다고 말하는 오류를 던진다.

Castle Windsor를 IValidationDictionary 기반의 ModelStateWrapper를 사용하도록 구성하고 ModelState를 생성자 매개 변수로 포함하려면 어떻게해야합니까? 당신이 순환 종속성 (결코 좋은 일을) 가지고있는 것처럼

로이드

답변

1

보인다. 초록색 공장described in this very similar question으로 사용하면 문제를 해결할 수 있습니다.

그러나 이와 같은 문제를 해결할 수는 있지만 순환 의존성을 없애기 위해 API를 다시 설계하는 것이 좋습니다. 순환 종속성은 종종 디자인 결함을 나타냅니다.

+0

그래서 것처럼 내 계정 컨트롤러보기 : IMembershipService _memSvc; IValidationDictionary _validationService; public AccountController (IValidationDictionaryFactory validationDFactory) { validationDFactory.Create (this); } 만약 그렇다면 조롱 한 모델 상태의 테스트에서 어떻게 실행합니까? 죄송합니다. 어리석은 질문 인 경우 종속성 주입 일이 하루 밖에 없습니다. – lloydphillips

+1

DI에 대한 가장 쉬운 접근법은 가능할 때마다 생성자 삽입을 사용하므로 모든 종속성을 생성자를 통해 주입하는 것입니다. 필요한 경우 Test Doubles로 대체 할 수도 있습니다. 추상 팩토리는 유선 연결시 종속성이 없을 때의 솔루션입니다. 거기에는 여러 가지 이유가있을 수 있습니다. –

0

잘못하고 있습니다. 그릇된 행동은 사용중인 컨테이너와 관련이 없습니다. 당신이 당신의 구성 요소를 등록하고 같이 다음

public AccountController(IValidationService service) 
{ 
    _validationService = service; 
    _memSvc = new MembershipService(_validationService); 
} 

,에서 OnCreate 방법을 사용하십시오 : 당신이 절대적으로 필요한 경우

은 그냥 같이 그것을 할

container.Register(
    Component.For<AccountController>() 
    .WheveverEleseYouNeedHere() 
    .OnCreate((k, controller) => 
     controller.ValidationService.Init(controller.ModelState))); 
+0

약 8 개의 컨트롤러가 있다면 각 컨트롤러를 등록해야만 모델 스테이트를 주입해야합니까? – lloydphillips

+0

자, 내가 혼란스러워하고 있다고 생각합니다. web.config에 인터페이스를 등록했다면이 코드를 WindsorControllerFactory에서 사용할 수 있습니까? 미안해. 나는 이것을 아주 잘 이해하고 있다고 생각하지 않는다. :) – lloydphillips