2009-03-17 38 views
99

Tôi có thể tìm ví dụ điển hình về cách triển khai hoàn toàn mẫu MVC trong Windows Forms ở đâu?Triển khai MVC bằng Windows Forms

Tôi đã tìm thấy nhiều hướng dẫn và ví dụ mã trên các trang web khác nhau (ví dụ: The Code Project và .NetHeaven), nhưng nhiều đại diện cho mẫu quan sát hơn MVC. Vì ứng dụng tôi muốn phát triển là dành cho một dự án trường học, tôi miễn cưỡng sử dụng các khung công tác như PureMVC hoặc MVC#.

+1

thể trùng lặp của [? Làm thế nào bạn sẽ thực hiện MVC trong một ứng dụng WindowsForms] (http://stackoverflow.com/questions/ 122388/làm thế nào-bạn-thực hiện-mvc-in-a-windowsforms-ứng dụng) – nawfal

+1

xem thêm [Làm thế nào để làm cho Databinding loại an toàn và hỗ trợ tái cấu trúc] (http://stackoverflow.com/questions/1329138/how-to –

Trả lời

109

Tôi quan điểm rằng các ứng dụng khác nhau và hiểu biết của chúng ta về cách ứng dụng nên được viết vẫn còn rất hạn chế. Các ứng dụng Windows Forms trong quá khứ mà tôi đã từng làm việc rất khác nhau. Một số khác biệt thiết kế tôi đã thấy được (bao gồm hầu hết các kết hợp):

  • trực tiếp nói chuyện với cơ sở dữ liệu (2 tầng)
  • Sử dụng một backend đã được viết cho các ứng dụng nhất định (3 tầng)
  • Sử dụng một bộ dịch vụ web được viết để sử dụng bởi nhiều ứng dụng và không thể thay đổi cho ứng dụng của bạn. (Kiến trúc hướng dịch vụ)
  • cập nhật được thực hiện bởi CRUD hoạt động
  • cập nhật được thực hiện với sự (lệnh gửi đến máy chủ backend) command pattern
  • Rất nhiều tập quán của data binding/không tập quán của dữ liệu ràng buộc
  • Hầu hết dữ liệu là "bảng như" (ví dụ: hóa đơn) hoạt động tốt trong các điều khiển lưới tiêu chuẩn/cần điều khiển tùy chỉnh cho hầu hết dữ liệu giao diện người dùng.
  • Một nhà phát triển/đội của 10 hoặc 20 nhà phát triển (chỉ trên UI)
  • Rất nhiều thử nghiệm đơn vị sử dụng mocks etc/không có đơn vị kiểm tra

Vì vậy, tôi không nghĩ rằng nó có thể tạo ra một thi của MVC (hoặc MVP) luôn phù hợp.

tốt nhất bài viết Tôi đã thấy thực sự giải thích MVC và tại sao một hệ thống MVC được xây dựng cách thức mà nó là, là "Build Your Own CAB" series by Jeremy D Miller. Sau khi làm việc mặc dù nó bạn sẽ có thể hiểu các tùy chọn của bạn tốt hơn rất nhiều. Microsoft's Smart Client Guidance (CAB/Microsoft Composite Application Block) cũng nên được xem xét. Đó là một chút phức tạp, nhưng nó có thể làm việc tốt cho các ứng dụng phù hợp.

Chọn một số MVC/MVP Implementation for a Winforms Project cung cấp tổng quan đáng để đọc. Rất nhiều người thích PureMVC. Tôi chưa bao giờ sử dụng nó, nhưng tôi sẽ xem xét nó vào lần sau tôi cần một khung MVC.

"Presenter First" là cách tiếp cận phát triển phần mềm kết hợp các ý tưởng của mẫu thiết kế Presenter Model Presenter (MVP) và test-driven development. Nó cho phép bạn bắt đầu bằng cách viết các bài kiểm tra bằng ngôn ngữ của khách hàng. Ví dụ:

"Khi tôi nhấp vào 'tiết kiệm' nút sau đó file nên được lưu lại và cảnh báo tập tin chưa được lưu nên biến mất.”

Tôi không có kinh nghiệm sử dụng "Presenter Đầu tiên ," nhưng tôi sẽ cung cấp cho nó một thử khi tôi nhận được một cơ hội, vì nó trông rất hứa hẹn.

khác stack   câu hỏi Overflow bạn có thể có thể muốn nhìn vào là herehere.

Nếu bạn đang nghĩ đến việc sử dụng WPF tại bất kỳ điểm nào, hãy xem mẫu Model-View ViewModel (MVVM). Đây là một video rất hay bạn nên xem: Jason Dolinger on Model-View-ViewModel.

MVVM (Model View View Model) Design Pattern for Winforms cung cấp tùy chọn khác có thể giúp dễ dàng chuyển đổi sang WPF hơn nếu cần. Magical.Trevor là một mẫu MVVM khác cho Windows Forms cũng bao gồm tự động ràng buộc dựa trên tên thuộc tính.


Cũng tự hỏi mình tại sao bạn đang sử dụng MVC.

  • Bạn có muốn kiểm tra đơn vị càng nhiều mã càng tốt không?
  • Bạn đang cố gắng cho phép sử dụng lại nhiều mã nhất có thể không?
  • Bạn đang cố gắng làm cho cơ sở mã của mình dễ hiểu?
  • 101 các lý do khác có thể hợp lệ cho một dự án cụ thể.

Khi bạn đã rõ ràng trên nhắm mục tiêu, bạn sẽ dễ dàng chọn một triển khai này hoặc cách triển khai khác.

+0

"CAB" này là gì? –

+0

@AgnelKurian, CAB là một bộ mã mẫu từ Microsoft về cách xây dựng ứng dụng - nó hiện nay chủ yếu là lịch sử. –

+0

Haha! Có, tôi nhớ những "khối ứng dụng" bây giờ. –

6

Bạn đã xem PureMVC chưa? Tôi đã tìm thấy rằng không ai có thể đồng ý về những gì MVC thực sự trông giống như một khi họ bắt đầu xây dựng một triển khai cụ thể.

Cập nhật: Bạn có thể xây dựng bắt đầu của riêng bạn bằng một cái gì đó đơn giản hơn như MobileMVC. Compact Framework code nên biên dịch/chạy OK trên Windows. Vì đây là bài tập ở trường, tôi khuyên bạn nên dành thời gian để học cách MVC thực sự hoạt động.

+0

Tôi có một bài tập ở trường cho một ứng dụng rất đơn giản để quản lý một hiệu sách, và tôi khá miễn cưỡng khi sử dụng một khung công tác như PureMVC. Tôi đang tìm kiếm một cái gì đó đơn giản hơn. – kjv

3

Bạn có thể muốn xem Differential Execution.

Dưới đây là trong SourceForge

IMO, nó là một cải tiến lớn về MVC, mặc dù nó vẫn còn khá bất thường.

2

Một ví dụ điển hình về việc triển khai MVC của riêng bạn bằng cách sử dụng Biểu mẫu Windows có thể được tìm thấy here. Mã nguồn được bao gồm.

Khi bạn đọc, nghiên cứu và viết mã cho bài tập này, bạn sẽ thấy rằng có rất nhiều bất đồng về cách MVC nên được triển khai. Đây là một trường hợp đơn giản phản ánh sự tách biệt các mối quan tâm cũng như một ví dụ điển hình về 'hệ thống ống nước' cần thiết để kết nối điều này.

Khi bạn ra khỏi trường, bạn có thể sẽ muốn quay trở lại trên một khuôn khổ như các áp phích khác đã đề nghị.

2

Khối ứng dụng giao diện hỗn hợp Microsoft bắt đầu cuộc sống của mình dưới dạng triển khai MVC (trong số các mẫu khác được triển khai). Phiên bản phát hành, tuy nhiên, phát triển thành một MVP thực hiện, có thể được lập luận là một loại giải thích khác nhau của khái niệm MVC.

Nếu bạn sẵn sàng kiểm tra mã của một triển khai MVP rất hoàn chỉnh (và bằng cách nào đó), bạn có thể tìm thấy MS-CAB là một trong những thành phần của Nhà máy phần mềm Microsoft Smart Client. Nó đi kèm với mã nguồn. Bạn có thể tìm thấy nó here. Chúc may mắn!

43

UPDATE: Ngoài câu trả lời trước của tôi dưới đây, tôi khuyên bạn nên đọc về "Presenter First" approach (đặc biệt là các bài viết PDF)

Tôi muốn giới thiệu MVP (PassiveView mô hình thực tế) thay vì MVC. Bạn không thực sự cần bất kỳ khung công tác đặc biệt nào cho điều này, đó chỉ là cách bạn tổ chức mã của mình.

Một cách tiếp cận (mà tôi thường mất) là để chia mỗi cửa sổ tạo thành ba đơn vị:

  1. Một lớp dẫn chương trình/điều khiển - đây là những gì bạn thực sự bắt đầu với khi phát triển một hình thức. Đây là nơi mà hầu hết/tất cả logic "doanh nghiệp" của bạn nên cư trú.
  2. Giao diện xem (IView), chứa các phương thức, thuộc tính và sự kiện. Giao diện này là tất cả mà người trình bày biết về biểu mẫu của bạn.
  3. Cuối cùng, khi bạn hoàn thành triển khai trình bày và chế độ xem (bao gồm các bài kiểm tra đơn vị), bạn có thể tạo lớp biểu mẫu thực tế và làm cho nó triển khai giao diện IView. Sau đó, nó chỉ là một câu hỏi về việc thêm các điều khiển thích hợp vào biểu mẫu và kết nối chúng với giao diện.

Ví dụ mã (một giả đơn giản, chỉ mang tính minh họa):

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

Đây là một cài đặt của biến thể MVP được gọi là PassiveView. Trong chế độ xem thụ động, chế độ xem không nên chọn người trình bày của anh ấy. Đối với một ví dụ tương tự (nhưng với chế độ xem REALLY thụ động), hãy kiểm tra mẫu này http://www.danieleteti.it/?p=221 (ví dụ bằng ngôn ngữ Delphi) –