패시브 뷰 아키텍처에서 Presenter 클래스에 대한 종속성 생성을 어디에 배치합니까?

StackOverflow https://stackoverflow.com/questions/849590

문제

방금 발표자 클래스에서 새 도메인 클래스를 리팩토링했지만 인스턴스화할 위치를 알 수 없습니다.

이는 제대로 관리되지 않은 레거시 프로젝트에 대한 대규모 지속적인 리팩토링 노력의 일부입니다.

Presenter는 현재 뷰의 OnLoad 이벤트에 의해 생성되고 있으며 뷰는 생성자의 매개 변수로 전달됩니다.프리젠터의 모든 공개 메소드는 매개변수가 없으며 void를 반환합니다.뷰의 공용 속성을 사용하여 뷰와 통신합니다.

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

이는 일반적인 Passive View 패턴이며 계속해서 이를 고수하고 싶습니다.그것은 나를 딜레마에 빠뜨립니다.발표자가 사용할 새 도메인 개체의 인스턴스를 만들어야 합니다.

  • 생성자를 통해 전달하면 뷰는 이를 생성해야 하며 불필요한 종속성을 얻게 됩니다.
  • 프리젠터 내의 아무 곳에나 생성하면 단위 테스트에서 모의 ​​객체로 대체할 수 없습니다.
  • 이를 프리젠터의 공용 속성으로 만들면 그것이 사용되는 프리젠터 메서드에 생성 순서 종속성을 도입하고 어떤 외부 클래스가 생성을 담당하는지 아직 해결하지 못했습니다.

현재 종속성 주입 프레임워크를 사용하고 있지 않습니다.미래에 하나를 사용하는 데 관심이 있지만 소스 코드는 여전히 제3자 프레임워크를 혼합에 도입하기에는 너무 취약합니다.

나는 어떤 제안이라도 환영합니다.

도움이 되었습니까?

해결책 2

훨씬 간단한 해결책을 찾았습니다.다음은 원래 수업의 예입니다.

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

이제 프로덕션 코드는 원래 인터페이스를 계속 사용하는 반면 단위 테스트에서는 뷰와 종속성 모두에 대해 모의 객체를 전달하는 새 인터페이스를 사용합니다.종속성 수가 계속 증가하면 일부 리팩토링이 필요하지만 가까운 미래에는 이것이 이상적인 솔루션입니다.

다른 팁

나는 이미 그것을 완료했습니다 !!!여기 좀 보세요 내 저장소.여기서 내 선택은 생성자를 사용하는 것입니다 ...가장 욕심 많은 사람을 만족시키기 위해 발표자는 Up일 것이라고 확신합니다.귀하의 경우 종속성에 대한 특정 구현 보기를 제공할 수 있습니다.

재미있게 보내세요 :)

지금은 저장소나 공장으로 가겠습니다.즉시 테스트가 가능할 것입니다.앞으로는 구현을 교체하여 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();
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top