2010-01-24 5 views
2

나는 IInventoryRepository를 inevected로 가져온 InventoryController를 가지고 있지만, 나의 필요성이 바뀌었고 이제는 컨트롤러 메소드 중 또 하나의 저장소 인 ILoansRepository (빌려준 인벤토리 아이템에 대한 정보 얻기)와 또 다른 하나를 사용해야한다. 일부 통계 및 추가 정보가 있습니다.모범 사례 : 여러 종속성 저장소를 ActionController에 가져 오는 방법은 무엇입니까?

실제로 작동하는 방식은 InventoryController의 ActionMethod에서 호출되는 ViewModelBuilder 클래스입니다. 즉 실제로 필요한 부품 인 ViewModelBuilder 클래스입니다. 현재 IInventoryRepository를 컨트롤러에서 빌더로 전달했지만 현재 어떻게해야합니까? 컨트롤러에 3 개의 레포지토리를 주입시켜야하고, 지금 내가했던 것처럼 빌더에 전달해야합니까? 아니면 그냥 IoC.GetInstance()를 수행해야합니까? (비록 그것이 안티 패턴이라고 생각하지 않습니까?)

감사합니다!

답변

2

는 다음 지침은 놀이에 와서 :

  • 너무 많은 의존성 당신이 Single Responsibility Principle을 위반 냄새입니다.
  • 4 개를 초과하는 종속성이 없습니다. 이것은 상대적 가이드 라인입니다. 나는 개인적으로 덜 노력하도록 노력한다. 세 번째 종속성을 추가하자마자 불안해 지지만 (위의 첫 번째 항목 참조) 최대 4 개까지 살 수 있습니다. 그 이상으로 나는 리팩토링해야한다.
  • 종속성을 전달하기 만하면 안됩니다.

세 가지 종속성이있는 한, 특정 디자인 측면을 더 신중하게 관찰해야하지만, 종속성의 수에 관해서는 안전 영역 내에서 다소 차이가 있습니다.

그러나 현재 구현을 이해하고 있으면 ViewModelBuilder에 의존성을 전달하기 만하면됩니다 (따라서 세 번째 글 머리 기호를 위반 함). 약간 더 나은 옵션은 (예를 들어, IViewModelBuilder와 같은) 추상화를 정의하고 이것을 세 곳의 저장소가 아닌 컨트롤러에 주입하는 것입니다.

서비스 로케이터 방지 패턴 (IoC.GetInstance())을 사용하지 않아야합니다.

+0

컨트롤러 자체가 CRUD를하기 위해 InventoryRepository를 필요로하지만, 실제로는 좋지만, 아마도 IRepo + IViewModelBuilder를 넘겨 줄 것입니다. 그것에 대해 어떻게 생각합니까? –

+0

당신은 IViewModelBuilder 을 만들기에 대해 어떻게 생각하십니까 다음 컨트롤러를받을 (IInventoryRepository 저장소, IViewModelBuilder viewModelBuilder) 내의 IoC 설정에서 이런 일이 : ForRequestedType >() .TheDefaultIsConcreteType는 () 및 카탈로그 뷰 모델 빌더 자체가 InventoryRepo과 LoansRepo의 인스턴스를 필요하지만 IOC는 너무 확인한다는 것을 처리? 그것은 다소 복잡하다고 느낀다. –

+0

제게 좋은 리팩토링 같아 보입니다. 더 복잡하지 않고, 단지 다른 것, 명확한 책임 분립. 여기에서 여전히 불만을 터트리는 유일한 이유는 IInventoryRepository와 IViewModelBinder를 섞으면 동일한 생성자에 '저수준'서비스 (저장소)와 '상위 서비스'가 혼합되어 있다는 것입니다. 그것은 비대칭을 암시하지만, 나 역시 항상 그렇게됩니다. 그러나, 그렇게 할 때, 나는 항상 '비수준'서비스가 또 다른 '고차원'서비스로 대체 될 수 있음을 알기 때문에 이런 종류의 비대칭에 주목한다. –

0

컨트롤러에 대한 많은 책임이 있습니다.

어쩌면 당신은 그것을 처리하기위한 특별한 서비스를 만들어야하고 그 서비스는 생성자에 의해 자동 배선 된 저장소 (IoC를 통해)를 사용해야합니다.

0
  1. 컨트롤러가 너무 많은 작업을 수행하는 경우 여러 컨트롤러로 분할하십시오.

  2. ViewModelBinder를 만들기 위해 3 개의 리포지토리를 주입하는 경우 :(I) ViewModelBinder 대신 삽입하십시오. IoC 컨테이너가 그 일을하고 당신을위한 의존성을 해결하도록하십시오; 또한 이것은 아키텍처, 테스트 등을 단순화합니다. ServiceLocator/GetInstance는 항상 피할 수있는 것은 아닙니다. 때로는 MVC 컨트롤러 팩토리와 같은 "루트"주입 지점이 없으며 모델 생성기와 같은 객체 생성을 제어 할 수없는 경우가 있습니다. 그래서 모델 빌더 (빌더가 아님)가 GetInstance를 호출하게하지만 직접 "루트"를 만듭니다. 예를 들어, GetInstance를 호출합니다. <IModelResolver>, GetInstance가 아닌 < 엔티티 >. 이와 같은 상황에서

+0

감사합니다.하지만 모델 작성기는 바인더가 아니라 다른 방식으로 정렬 된 것입니다. 바인더가 요청에서 정보를 가져 와서 객체에 바인딩하면 빌더는 필요한 모든 정보를 얻게됩니다. 보기로 전송되는 개체를 만드십시오. http://tiny.cc/michelottiMVC 문제는 인벤토리 컨트롤러가 너무 많이하고 있다고 생각하지 않지만이 조각이 필요하다는 것입니다. 그 방법 중 하나 (인벤토리 목록, 아이템이 빌려준 것이고, 대출 인벤토리에있는 것임을 말해야하기 때문에)에 대한 정보를 얻거나, 대출 및 인보이스를 병합해야합니까? repos? –

+0

모든 제품에 대한 모든 대출, 모든 제품에 대한 현재 대출, 연체 된 대출, 한 제품에 대한 모든 대출 (해당 내역), 특정 사용자에게 제공된 대출, 연체 된 대출을받은 사람들의 기록이 필요하기 때문에 현재 별도의 저장소입니다. 등 –

+0

별도의 repo에 대해, Builder를 작성하려면 3 repos가 필요하고, 데이터를 얻으려면 1 개가 필요하면 제어기에 1 repo 및 1 Builder를 주입하십시오. 의존성에서 객체를 직접 생성하지 마십시오. – queen3