Triển khai MVC với Windows Forms


102

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

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



Câu trả lời:


115

Tôi cho rằng các ứng dụng rất khác nhau và hiểu biết của chúng tôi về cách viết các ứng dụng vẫn còn rất hạn chế. Các ứng dụng Windows Forms trước đây mà tôi đã làm việc rất khác biệt với nhau. Một số khác biệt về thiết kế mà tôi đã thấy là (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 chương trình phụ trợ đã được viết cho ứng dụng nhất định (3 cấp)
  • Sử dụng một tập hợp các 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 các hoạt động CRUD
  • Cập nhật đang được thực hiện với mẫu lệnh (gửi lệnh đến máy chủ phụ trợ)
  • Rất nhiều cách sử dụng ràng buộc dữ liệu / không sử dụng ràng buộc dữ liệu
  • Hầu hết dữ liệu “giống bảng” (ví dụ: hóa đơn) hoạt động tốt trong đ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 / nhóm gồm 10 hoặc 20 nhà phát triển (chỉ trên giao diện người dùng)
  • Rất nhiều bài kiểm tra đơn vị bằng cách sử dụng mocks, v.v. / không kiểm tra đơn vị

Do đó, tôi không nghĩ rằng có thể tạo một triển khai MVC (hoặc MVP) luôn phù hợp.

Các bài viết hay nhất mà tôi đã xem thực sự giải thích về MVC và lý do tại sao hệ thống MVC được xây dựng theo cách của nó, là loạt bài "Build Your Own CAB" của Jeremy D Miller . Sau khi làm việc, bạn sẽ có thể hiểu các lựa chọn của mình tốt hơn rất nhiều. Hướng dẫn Ứng dụng Thông minh của Microsoft (CAB / Khối Ứng dụng Tổng hợp Microsoft) cũng nên được xem xét. Nó hơi phức tạp một chút, nhưng nó có thể hoạt động tốt cho các ứng dụng phù hợp.

Lựa chọn Triển khai MVC / MVP cho Dự án Winforms cung cấp một cái nhìn 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 tới khi tôi cần một khuôn khổ MVC.

" Presenter First " là một 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ế Model View Presenter (MVP) và phát triển theo hướng thử nghiệm . 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 nút 'lưu' thì tệp sẽ được lưu và cảnh báo tệp chưa lưu sẽ biến mất."

Tôi không có kinh nghiệm sử dụng "Trình bày trước tiên", nhưng tôi sẽ thử khi có cơ hội, vì nó có vẻ rất hứa hẹn.

Các câu hỏi khác về Stack Overflow mà bạn có thể muốn xem ở đâyở đây .

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

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


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

  • Bạn có muốn có thể kiểm tra đơn vị càng nhiều mã càng tốt không?
  • Bạn có đ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 lý do khác có thể hợp lệ cho một dự án nhất định.

Khi bạn đã rõ ràng về mục tiêu của mình , việc lựa chọn cách triển khai này hay cách khác sẽ trở nên dễ dàng hơn.


@AgnelKurian, CAB là một bộ mã mẫu của Microsoft về cách xây dựng ứng dụng - bây giờ nó chủ yếu là lịch sử.
Ian Ringrose,

Haha! Vâng, tôi nhớ những "Khối ứng dụng" bây giờ.
Agnel Kurian

45

CẬP NHẬT: Ngoài câu trả lời trước đây của tôi bên dưới, tôi khuyên bạn nên đọc về cách tiếp cận "Người trình bày là trên hết" (đặc biệt là các bài báo PDF)

Tôi muốn giới thiệu MVP (thực tế là mẫu PassiveView) thay vì MVC. Bạn không thực sự cần bất kỳ khuôn khổ đặc biệt nào cho việc 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 áp dụng) là chia từng biểu mẫu cửa sổ thành ba thực thể:

  1. Lớp người trình bày / người điều khiển - đây là những gì bạn thực sự bắt đầu khi phát triển một biểu mẫu. Đây là nơi hầu hết / tất cả logic "kinh doanh" của bạn nên cư trú.
  2. Giao diện dạng 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ả những gì 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 việc triển khai trình trình bày và chế độ xem (bao gồm các bài kiểm tra đơn vị), sau đó 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 đó, vấn đề chỉ là 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.

Mã ví dụ (một mã giả đơn giản, chỉ để 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 triển khai của biến thể MVP được gọi là PassiveView. Trong quan điểm thụ động, quan điểm không nên chọn người trình bày của mình. Đối với một ví dụ tương tự (nhưng với một cái nhìn REALLY thụ động) kiểm tra mẫu này danieleteti.it/?p=221 (ví dụ trong ngôn ngữ Delphi)
Daniele Teti

6

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

Cập nhật: Bạn có thể tự xây dựng bắt đầu bằng thứ gì đó đơn giản hơn, chẳng hạn như MobileMVC . Mã Compact Framework 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 tìm hiểu cách thức hoạt động của MVC.


Tôi có một nhiệm vụ ở 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á ngần ngại khi sử dụng một khuôn khổ như PureMVC. Tôi đang tìm kiếm một cái gì đó đơn giản hơn.
kjv


2

Có thể tìm thấy một ví dụ điển hình về việc triển khai MVC của riêng bạn bằng Windows Forms tại đây . Mã nguồn được bao gồm.

Khi bạn đọc, nghiên cứu và viết mã cho nhiệm vụ này, bạn sẽ thấy rằng có rất nhiều bất đồng về cách MVC nên được thực hiện. Đây là một trường hợp đơn giản phản ánh sự tách biệt của 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 rời khỏi trường học, bạn có thể sẽ muốn quay trở lại khuôn khổ như các áp phích khác đã đề xuất.


2

Khối Ứng dụng Giao diện Tổng hợp của Microsoft bắt đầu cuộc sống của nó dưới dạng triển khai MVC (trong số các mẫu khác mà nó đã triển khai). Tuy nhiên, phiên bản phát hành đã phát triển thành một bản triển khai MVP, có thể được cho là một kiểu diễn giải khác về khái niệm MVC.

Nếu bạn sẵn sàng kiểm tra mã của việc triển khai MVP rất đầy đủ (và bằng cách nào đó phức tạp), 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 Máy khách Thông minh của Microsoft. Nó đi kèm với mã nguồn. Bạn có thể tìm thấy nó ở đây . Chúc may mắn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.