Windows Forms로 MVC 구현


102

Windows Forms에서 MVC 패턴을 완전히 구현하는 방법에 대한 좋은 예는 어디에서 찾을 수 있습니까?

다양한 사이트 (예 : The Code Project 및 .NetHeaven) 에서 많은 자습서와 코드 예제를 찾았 지만 MVC보다 관찰자 패턴을 더 잘 대표합니다. 내가 개발하려는 응용 프로그램이 학교 프로젝트 용이므로 PureMVC 또는 MVC # 와 같은 프레임 워크를 사용하는 것을 꺼립니다 .



답변:


115

나는 응용 프로그램이 서로 매우 다르고 응용 프로그램 작성 방법에 대한 이해가 여전히 매우 제한적이라는 견해를 가지고 있습니다. 이전에 작업 한 Windows Forms 응용 프로그램은 서로 너무 달랐습니다. 내가 본 디자인 차이 중 일부는 다음과 같습니다 (대부분의 조합 포함).

  • 데이터베이스와 직접 대화 (2 계층)
  • 지정된 애플리케이션 용으로 작성된 백엔드 사용 (3 계층)
  • 많은 애플리케이션에서 사용하도록 작성되었으며 애플리케이션에 대해 변경할 수없는 웹 서비스 세트를 사용하십시오. (서비스 지향 아키텍처)
  • CRUD 작업에 의해 수행되는 업데이트
  • 명령 패턴 으로 수행중인 업데이트 (백엔드 서버로 명령 보내기)
  • 많은 데이터 바인딩 사용 / 데이터 바인딩 사용 없음
  • 대부분의 데이터는 표준 그리드 컨트롤에서 잘 작동하거나 대부분의 UI 데이터에 대한 사용자 지정 컨트롤이 필요한 "표와 같은"(예 : 송장)입니다.
  • 개발자 1 명 / 개발자 10 명 또는 20 명 팀 (UI에서만)
  • 모의 등을 사용한 많은 단위 테스트 / 단위 테스트 없음

따라서 항상 잘 맞는 MVC (또는 MVP) 구현을 하나만 만드는 것은 불가능하다고 생각합니다.

내가 본 가장 좋은 게시물은 정말 설명 과 MVC를 MVC 시스템이이 방법을 구축되면, 인 제레미 D 밀러 "자신의 CAB 빌드"시리즈 . 그래도 작업 한 후에는 옵션을 훨씬 더 잘 이해할 수있을 것입니다. Microsoft의 Smart Client Guidance (CAB / Microsoft Composite Application Block) 도 고려해야합니다. 약간 복잡하지만 잘 맞는 응용 프로그램에 적합합니다.

Winforms 프로젝트를위한 MVC / MVP 구현을 선택하면 읽을 가치가있는 개요가 제공됩니다. 많은 사람들이 PureMVC를 좋아 합니다. 나는 그것을 사용한 적이 없지만 다음에 MVC 프레임 워크가 필요할 때 그것을 볼 것입니다.

" Presenter First "는 MVP (Model View Presenter) 디자인 패턴과 테스트 주도 개발 의 아이디어를 결합한 소프트웨어 개발 접근 방식입니다 . 고객의 언어로 테스트를 작성하여 시작할 수 있습니다. 예를 들면 :

" '저장'버튼을 클릭하면 파일이 저장되고 저장되지 않은 파일 경고가 사라집니다."

"Presenter First"를 사용한 경험은 없지만 기회가있을 때 시도해 보겠습니다. 매우 유망 해 보입니다.

다른 Stack Overflow 질문은 여기여기에 있습니다 .

언제든 WPF 를 사용할 생각이라면 MVVM (Model-View ViewModel) 패턴을 살펴보십시오 . 다음은 주목 해야 할 매우 좋은 비디오입니다 : Model-View-ViewModel의 Jason Dolinger .

Winforms 용 MVVM (모델보기보기 모델) 디자인 패턴은 필요한 경우 WPF로 쉽게 변환 할 수있는 또 다른 옵션을 제공합니다. Magical.Trevor 는 속성 이름을 기반으로하는 자동 바인딩도 포함하는 Windows Forms 용 또 다른 MVVM 샘플입니다.


또한 MVC를 사용하는 이유 를 자문 해보십시오 .

  • 가능한 한 많은 코드를 단위 테스트 할 수 있기를 원하십니까?
  • 가능한 한 많은 코드를 재사용하려고합니까?
  • 코드베이스를 이해하기 쉽게 만들려고합니까?
  • 주어진 프로젝트에 유효 할 수있는 101 개의 다른 이유.

목표가 명확 해지면 하나의 구현 또는 다른 구현을 선택하기가 더 쉬워집니다.


@AgnelKurian, CAB는 앱을 빌드하는 방법에 대한 Microsoft의 샘플 코드 세트였습니다. 이제 대부분 역사입니다.
Ian Ringrose 2013

ㅋ! 예, 이제 "응용 프로그램 블록"을 기억합니다.
Agnel Kurian 2013

45

업데이트 : 아래의 이전 답변 외에도 "발표자 우선"접근 방식 (특히 PDF 기사)에 대해 읽어 볼 것을 제안 합니다.

MVC 대신 MVP (실제로 PassiveView 패턴)를 권장합니다. 이를 위해 특별한 프레임 워크가 필요하지 않습니다. 코드를 구성하는 방법입니다.

한 가지 접근 방식 (일반적으로 사용)은 각 창 양식을 세 개의 항목으로 분할하는 것입니다.

  1. 발표자 / 컨트롤러 클래스-이것은 양식을 개발할 때 실제로 시작하는 것입니다. 여기에 "비즈니스"로직의 대부분 / 전체가 있어야합니다.
  2. 메서드, 속성 및 이벤트를 포함하는보기 인터페이스 (IView). 이 인터페이스는 발표자가 양식에 대해 알고있는 모든 것 입니다.
  3. 마지막으로 발표자와 뷰 (단위 테스트 포함) 구현을 마치면 실제 양식 클래스를 만들고 IView 인터페이스를 구현하도록 만들 수 있습니다. 그런 다음 양식에 적절한 컨트롤을 추가하고 인터페이스에 연결하는 문제입니다.

예제 코드 (단순한 의사 코드, 설명 용) :

interface IView
{
    string Username { get; set; }
    string Password { get; set; }

    event EventHandler LogOnButtonClicked;

    void InformUserLogOnFailed();
    void MoveToMainScreen();
}

class Presenter
{
    public Presenter(IView view)
    {
        this.view = view;
        view.LogOnButtonClicked += new EventHandler(OnLogOnButton);
    }

    private void OnLogOnButton()
    {
        // we ask some service to verify the username/password
        bool isLogOnOk = logOnService.IsUserAndPasswordOk(view.Username, view.Password);
        if (isLogOnOk)
            view.MoveToMainScreen();
        else
        {
            view.Username = "";
            view.Password = "";
            view.InformUserLogOnFailed();
        }
    }

    private IView view;
}

class Form : IView
{
    public Form()
    {
        presenter = new Presenter(this);
    }

    public string Username
    {
        get { return TextBoxUsername.Text; }
        set { TextBoxUsername.Text = value; }
    }

    public string Password
    {
        get { return TextBoxPassword.Text; }
        set { TextBoxPassword.Text = value; }
    }

    public void InformUserLogOnFailed()
    {
        MessageBox.Show("Invalid username or password.");
    }

    public void MoveToMainScreen()
    {
        // code for opening another form...
    }

    private Presenter presenter;
}

7
이것은 PassiveView라는 MVP 변형의 구현입니다. 패시브 뷰에서 뷰는 발표자를 선택해서는 안됩니다. 유사한 예제 (정말 수동적 인 뷰 포함)를 보려면이 샘플 danieleteti.it/?p=221 (델파이 언어의 예제)을 확인하십시오.
Daniele Teti

6

PureMVC를 보셨습니까 ? 특정 구현을 구축하기 시작하면 MVC가 실제로 어떻게 보이는지 아무도 동의 할 수 없다는 것을 알게되었습니다.

업데이트 : MobileMVC 와 같은 더 간단한 것으로 시작하여 직접 빌드 할 수 있습니다 . Compact Framework 코드는 Windows에서 정상적으로 컴파일 / 실행되어야합니다. 이것은 학교 과제이기 때문에 실제로 MVC가 실제로 어떻게 작동하는지 배우는 데 시간을 할애하는 것이 좋습니다.


저는 서점을 관리하기위한 매우 간단한 응용 프로그램에 대한 학교 과제가 있으며 PureMVC와 같은 프레임 워크를 사용하는 것을 매우 꺼립니다. 더 간단한 것을 찾고 있습니다.
kjv


2

Windows Forms를 사용하여 MVC 구현을 롤링하는 좋은 예는 여기 에서 찾을 수 있습니다 . 소스 코드가 포함되어 있습니다.

이 과제에 대한 코드를 읽고, 연구하고, 작성할 때 MVC 구현 방법에 대해 많은 의견 차이가 있음을 알게 될 것입니다. 이것은 우려의 분리와이를 연결하는 데 필요한 '배관'의 좋은 예를 반영하는 간단한 사례입니다.

학교를 졸업 할 때 다른 포스터에서 권장하는 프레임 워크로 돌아가고 싶을 것입니다.


2

Microsoft Composite Interface Application 블록은 MVC 구현으로 시작되었습니다 (구현 된 다른 패턴 중에서도). 그러나 릴리스 버전은 MVC 개념에 대한 일종의 다른 해석이라고 주장 할 수있는 MVP 구현으로 발전했습니다.

매우 완전한 (그리고 다소 복잡한) MVP 구현의 코드를 확인하려는 경우 MS-CAB를 Microsoft Smart Client Software Factory의 구성 요소 중 하나로 찾을 수 있습니다. 소스 코드와 함께 제공됩니다. 여기에서 찾을 수 있습니다 . 행운을 빕니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.