2009-05-11 5 views
4

나는 발표자 클래스에서 새 도메인 클래스를 리팩토링했지만 어디에서 인스턴스화해야하는지 알 수 없다.Passive View 아키텍처에서 Presenter 클래스에 대한 종속성 생성은 어디에 두어야합니까?

이는 기존 프로젝트의 유지 관리가 미진한 진행중인 대규모 리팩터링 작업의 일부입니다.

발표자는 현재보기의 OnLoad 이벤트에 의해 작성되고 있으며보기는 생성자의 매개 변수로 전달됩니다. 발표자의 모든 public 메서드는 매개 변수가 없으므로 반환되지 않습니다. 보기의 공용 속성을 사용하여보기와 통신합니다.

본질적으로 겸손한 형태 인 견해는 전적으로 모든 것에 대한 발표자에 달려 있습니다.

이것은 일반적인 패시브 뷰 패턴이며 계속 적용하고 싶습니다. 내 딜레마에 빠지게된다. 발표자가 사용할 새 도메인 객체의 인스턴스를 만들어야합니다.

  • 생성자를 통해 전달하면보기에서 불필요한 종속성이 발생합니다.
  • 발표자의 아무 곳에서나 만들면 단위 테스트에서 모의 ​​개체로 바꿀 수 없습니다.
  • 발표자의 공개 속성으로 사용하는 경우 발표자 메서드에 생성 순서 종속성을 사용하고 외부 클래스가이를 작성하는 책임을 해결하지 못했습니다.

현재 종속성 주입 프레임 워크를 사용하고 있지 않습니다. 앞으로는 소스 코드를 사용하는 것에 관심이 있지만 제 3 자 프레임 워크를 소개하기에는 여전히 취약합니다.

나는 어떤 제안이 있어도 열람 할 수 있습니다.

답변

1

훨씬 간단한 해결책을 발견했습니다. 여기에 내 원래 클래스의 예 :

public Presenter(IView view) 
{ 
    this.View = view; 
} 

내가 생성자의 인수로 나의 새로운 의존성을 통과하고 싶었지만뿐만 아니라 내 생각에이 종속성을 추가하지 않았다. 구출 사슬에 묶인 생성자!

public Presenter(IView view):this(view, new Dependency()){} 

public Presenter(IView view, IDependency dependency) 
{ 
    this.View = view; 
    this.Dependency = dependency; 
} 

지금 생산 코드 유닛 테스트 뷰 의존성 모의 객체 모두에서 전달하는 새로운 하나를 사용하는 동안 원본 인터페이스를 계속 사용한다. 종속성 수가 계속 증가하면 일부 리팩토링이 필요할 것입니다. 그러나 즉각적인 미래를 위해서는 이상적인 솔루션입니다.

2

나는 이미 완료했습니다! my repository 여기를보세요. 여기 내 선택은 생성자를 사용하는 것입니다 ... 가장 탐욕스러운 것을 만족 시키십시오. 귀하의 경우에는 특정 impl에 종속성에 대한 뷰를 제공 할 수 있습니다.

는 재미 :)

+0

디자인이 재미 있습니다. 보기가 수동보기 패턴에 맞지만 발표자와 컨트롤러 모두에서 본 적이 없다.내가 본 예에서는 발표자가 무거운 물건을 들고 도메인 객체 및 데이터 저장소와 이야기하는 것을 보았습니다. 귀하의 중간 남자로서의 발표자와 작업을하는 컨트롤러가있는 동안. 추가 레이어의 장점은 무엇입니까? –

+0

이점은 분명합니다 ... 모든 과중한 작업이 발표자에게 완료되면 복잡한 시나리오에서 네비게이션을 관리하는 것이 컨트롤러의 책임입니다. 보기가 다른 것에 대해 알지 못하는 마법사의 예제처럼 모든 것이 컨트롤러에 의해 처리됩니다. – ruslander

0

지금의 저장소 또는 공장 가고 싶어. 즉시 테스트 할 수 있습니다. 앞으로 DI 라이브러리로 바꾸기 위해 구현을 대체 할 수 있습니다.

public class DomainObjectsRepository 
{ 
    /// <summary> 
    /// can not be instantiated, use <see cref="Instance"/> instead. 
    /// </summary> 
    protected DomainObjectsRepository() 
    { 

    } 

    static DomainObjectsRepository() 
    { 
     Instance = new DomainObjectsRepository(); 
    } 

    public static DomainObjectsRepository Instance { get; set; } 


    public virtual ICustomerDao GetCustomerDao() 
    { 
     return new CustomerDao(); 
    } 
} 

public class DomainObjectsRepositoryMock : DomainObjectsRepository 
{ 
    public override ICustomerDao GetCustomerDao() 
    { 
     return new CustomerDaoMock(); 
    } 
} 
관련 문제