[winforms] Windows Forms 용 UI 디자인 패턴 (예 : WPF 용 MVVM)

MVVM은 WPF에 가장 적합하기 때문에 WPF와 함께 가장 일반적으로 사용됩니다. 그러나 Windows Forms는 어떻습니까? Windows Forms에서도 이와 같이 널리 사용되는 접근 방식 / 디자인 패턴이 있습니까? Windows Forms와 명시 적으로 잘 작동합니까? 이것을 잘 설명하는 책이나 기사가 있습니까? MVP 또는 MVC 기반일까요?



답변

나는 MVP를 시도했지만 Windows 양식에서도 훌륭하게 작동하는 것 같습니다. 이 책에는 MVP 패턴 (샘플 급여 응용 프로그램)이있는 Windows 양식의 예가 있습니다. 응용 프로그램은 그렇게 복잡하지 않지만 응용 프로그램을 만드는 방법에 대한 아이디어를 제공합니다.

C #의 민첩한 원칙, 패턴 및 사례

당신은 소스 코드를 얻을 수있는
소스 코드를

편집하다:

MVP 패턴에는 두 가지 변형이 있습니다. (a) 수동보기 및 (b) 감독 컨트롤러

복잡한 데이터 바인딩 시나리오의 경우 Supervising 컨트롤러 패턴을 선호합니다. 컨트롤러 패턴을 감독 할 때 데이터 바인딩 책임은 뷰에 있습니다. 따라서 트리보기 / 데이터 그리드의 경우 각보기에 있어야하며보기에 독립적 인 논리 만 발표자에게 이동해야합니다.

다음 MVP 프레임 워크 MVC # -MVP 프레임 워크를 살펴 보는 것이 좋습니다.

이름으로 가지 마십시오 (MVP 프레임 워크).

간단한 winforms MVP 비디오
Winforms-MVP

드롭 다운 목록 MVP 처리 예
-DropDownList

간단한 트 리뷰 바인딩 예제 (가난한 바인딩) BindTree ()에서 트 리뷰 특정 로직을 추가 할 수 있습니다.

아래는 코드 스 니펫입니다 … 테스트되지 않았으며 직접 생각하여 입력했습니다 …

public interface IYourView
{
   void BindTree(Model model);
}

public class YourView : System.Windows.Forms, IYourView
{
   private Presenter presenter;

   public YourView()
   {
      presenter = new YourPresenter(this);
   }

   public override OnLoad()
   {
         presenter.OnLoad();
   }

   public void BindTree(Model model)
   {
       // Binding logic goes here....
   }
}

public class YourPresenter
{
   private IYourView view;

   public YourPresenter(IYourView view)
   { 
       this.view = view;
   }

   public void OnLoad()
   {
       // Get data from service.... or whatever soruce
       Model model = service.GetData(...);
       view.BindTree(model);
   }
}


답변

이미 말했듯이 Winforms를 사용할 때 항상 MVP 패턴으로 작업했습니다. 그러나 사용할 디자인 패턴이 바로 사용한다는 의미는 아닙니다. MVP에는 수많은 안티 패턴이 첨부되어 있습니다.

좋은 방법으로 모든 것을 시작하려면 스마트 클라이언트 구축을위한 프레임 워크를 사용해야합니다. 따라서 해당 설계 및 실습을 사용하는 것이 좋습니다. Smart Client Software Factory http://www.codeplex.com/smartclient

현재 스마트 클라이언트 프레임 워크에 대한 토론이 있습니다. http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

추신 : 나는 MVP 안티 패턴 에이 게시물을 좋아합니다 : http://blog.mattwynne.net/2007/06/13/mvp-smells/

도움이 되었기를 바랍니다


답변

모델 – 뷰 – 뷰 모델 (MVVM) 패턴 디자인 패턴이다. 정의에 따라 디자인 패턴은 객체 지향 세계에서 일반적인 솔루션을 보여 주며이 솔루션은 다양한 플랫폼 (WPF, WinForms, Java Swing 등)에 적용될 수 있습니다. MVVM은 강력한 바인딩 기능을 활용하므로 WPF와 함께 사용하는 것이 가장 좋습니다. 그러나 Windows Forms는 데이터 바인딩도 지원합니다.

WAF 윈도우 어댑터 양식 방법 윈도우 폼 응용 프로그램에서 MVVM 패턴을 적용하는 방법을 보여줍니다.


답변

필자는 MVP-VM이라는 MVP / MVVM 디자인 패턴의 변형에 대해 작성했습니다.이 테스트는 전체 테스트 범위를 필요로하고 프레젠테이션을 모델 데이터로 업데이트하는 주요 메커니즘으로 데이터 바인딩을 사용하는 winforms 응용 프로그램을위한 맞춤형 솔루션입니다.

.NET Winforms 용 MVVM

MVVM (Model View View Model)은 데이터 바인딩 (WPF)을 강화하는 환경의 데이터에서 프레젠테이션을 분리하기위한 유사한 접근 방식을 도입했습니다. .NET Framework 2.0은 이미 응용 프로그램 개체의 디자인 타임 바인딩을 허용하는 고급 데이터 바인딩 인프라를 제공하므로 ‘모델보기’엔터티는 MVP 기반 환경에 매우 적합합니다.


답변

두 명의 동료에게 동일한 질문을했습니다. Windows Forms 용 MVVM이 가능합니까? 모두가 나에게 똑같은 대답했다 : ” 아니! 길을 WindowsForms는 WPF와 실버 라이트의 풍부한 바인딩이 없습니다 (일회용, 한방향, 양방향, OnewayToSource) 그것은 또한 TypeConverters이 없습니다 .”

  • WindowsForms 용 Screen Activator 패턴- 여기서는 Caliburn.Micro에서 포트하여 jagui로 찾을 수 있습니다 .
  • 풍부한 바인딩 및 TypeConverters- Kent Boogaart의 Truss , UI 독립적 인 방식으로 수행
  • 명령 -WPF (WAF Application Framework) 에는 일부 MVVM 항목, 즉 명령을 처리하는 WafWinFormsAdapter 프로젝트가 있습니다.

다시 한 번, WinForms 용 MVVM을 사용할 수 있습니까? 응 우리는 할 수있어. 우리는 모든 조각을 가지고 있습니다. 우리는 그것들을 서로 붙이기 만하면됩니다.


답변

MVP는 WinForms 개발에 가장 적합한 패턴이라고 믿습니다 . WinForms에 대한 Microsoft의 프레임 워크 인 CAB 에서 사용하는 것으로 부분적으로 증명됩니다 .

View 코드를 테스트 할 수 없기 때문에 WinForms에서 MVP를 사용하여 View에서 코드를 추출합니다. 또한 공유 할 수없는 View에서 벗어나기 위해 재사용 (또는 복제)이 필요한 코드를 활성화합니다.

MVP 패턴 ExceptionReporter.NET을 사용하는 내 프로젝트를 참조 할 수 있습니다 . 나는 그것을 완벽하게 사용하지 않는다고 확신합니다.

WPF에서 작동하는 MVVM을 언급했습니다. 그 이유는 강력한 데이터 바인딩 지원 때문입니다. WPF에서 데이터 바인딩을 사용하지 않았고 반드시 강제하지 않은 경우 MVP를 선택할 수 있습니다. 요점은 MVP가 모든 클라이언트 측 응용 프로그램에 대한 강력한 선택이라는 것입니다. WPF가 아닌 프로젝트간에 코드를 공유 할 계획이라면 WPF에서도 ‘더 나은’선택이 될 수 있습니다.

WinForms에서 MVP 사용의 가치에 대한 자세한 증거는 MVP 사용에 대한 Boodhoo의 비디오 프레젠테이션을 참조하십시오.
http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-presenter
http://msdn.microsoft.com/en-us/magazine/cc188690.aspx 의 동일한 저자에 의한 MSDN 기사


답변

BindTree 방법은 나에게 약간의 결함이있는 것 같습니다. 갑자기 The View는 모델을 잘 알고 있습니다. 그게 좋은가요? 이런 종류의 문제에 직면 한 수많은 사람들이 있어야합니다. 나는 그것에 관한 책이 없다는 것에 놀랐습니다. .NET 세계의 모든 것에 관한 책이 있기 때문에.

이 디자인은 모델을 숨기는 것이 아니라 응용 프로그램의 여러 계층 간의 상호 작용을 정확하게 정의합니다. 백엔드를 완전히 변경할 수 있으며 Bindtree를 통해 모델을 전달하면 UI가 계속 작동합니다.

이제 Rajesh가 제공하는 예제에서 Model 클래스는 이름을 잘못 선택했을 수 있습니다. TreeData 또는 RecordsData 일 수 있습니다. 그러나 그것을 정의하면 Winforms의 바인딩 메커니즘을 사용하여 특정 컨트롤을 기본 데이터에 바인딩해야합니다.

이런 종류의 자료를 찾아 볼 수있는 가장 좋은 사이트는 여기 입니다. Martin Fowler는 다양한 유용한 UI 디자인 패턴과 엔터프라이즈 디자인 패턴을 수집했습니다.

이것의 핵심은 각 레이어가 서로 상호 작용하는 방식을 정확하게 정의하기 위해 인터페이스를 사용하는 것입니다.

내 자신의 응용 프로그램 (금속 절삭 기계를 실행하는 데 사용되는 CAD / CAM 응용 프로그램)에서 내 구조는 다음과 같습니다.

  • 양식 인터페이스를 구현하는 양식
  • 폼 인터페이스를 통해 폼과 상호 작용하는 뷰 인터페이스를 구현하는 뷰가있는 UIDLL. 특정 뷰는 UIViewDLL에 등록됩니다. 뷰는 모델과 상호 작용하는 명령 라이브러리에서 찾은 명령 객체를 실행합니다.
  • 명령 라이브러리; ICommand를 구현하는 명령 목록 뷰와 상호 작용하는 명령은 UIViewDLL에 노출 된 인터페이스를 통해 수행됩니다.
  • UIViewDLL; 명령이 사용하는 View Interface를 노출합니다.
  • 모델; 내 응용 프로그램의 핵심 데이터 구조를 구성하는 클래스와 컬렉션 나에게 이것은 재료, 절단 경로, 모양, 시트, 횃불 등과 같은 것들입니다.
  • 유용; 회사에서 사용하는 유틸리티 클래스가 일반적으로 사용되는 DLL은 다른 응용 프로그램에 걸쳐 있습니다. 복잡한 수학 함수를 예로들 수 있습니다.