Menerapkan MVC dengan Formulir Windows

102

Di mana saya dapat menemukan contoh yang baik tentang cara menerapkan pola MVC sepenuhnya dalam Formulir Windows?

Saya menemukan banyak tutorial dan contoh kode di berbagai situs (misalnya, The Code Project dan .NetHeaven), tetapi banyak yang lebih mewakili pola pengamat daripada MVC. Karena aplikasi yang ingin saya kembangkan adalah untuk proyek sekolah, saya enggan menggunakan framework seperti PureMVC atau MVC # .

kjv
sumber

Jawaban:

115

Saya berpandangan bahwa aplikasi sangat berbeda satu sama lain dan pemahaman kita tentang bagaimana aplikasi harus ditulis masih sangat terbatas. Aplikasi Windows Forms yang pernah saya kerjakan sangat berbeda satu sama lain. Beberapa perbedaan desain yang pernah saya lihat adalah (termasuk sebagian besar kombinasi):

  • Langsung berbicara ke database (2 tingkat)
  • Gunakan backend yang telah ditulis untuk aplikasi yang diberikan (3 tingkat)
  • Gunakan sekumpulan layanan web yang ditulis untuk digunakan oleh banyak aplikasi dan tidak dapat diubah untuk aplikasi Anda. (Arsitektur berorientasi layanan)
  • Pembaruan sedang dilakukan oleh operasi CRUD
  • Pembaruan sedang dilakukan dengan pola perintah (mengirim perintah ke server backend)
  • Banyak sekali penggunaan data binding / tidak ada penggunaan data binding
  • Sebagian besar data berupa "tabel seperti" (mis. Faktur) yang berfungsi dengan baik dalam kontrol kisi standar / memerlukan kontrol khusus untuk sebagian besar data UI.
  • Satu pengembang / tim yang terdiri dari 10 atau 20 pengembang (hanya di UI)
  • Banyak tes unit menggunakan ejekan dll / tidak ada tes unit

Oleh karena itu saya rasa tidak mungkin untuk membuat satu implementasi MVC (atau MVP) yang selalu cocok.

Posting terbaik yang pernah saya lihat benar-benar menjelaskan MVC dan mengapa sistem MVC dibangun seperti itu, adalah seri "Build Your Own CAB" oleh Jeremy D Miller . Setelah mengerjakannya, Anda harus dapat memahami opsi Anda jauh lebih baik. Panduan Klien Cerdas Microsoft (CAB / Blok Aplikasi Komposit Microsoft) juga harus dipertimbangkan. Ini agak rumit, tetapi dapat bekerja dengan baik untuk aplikasi yang cocok.

Memilih Implementasi MVC / MVP untuk Proyek Winforms memberikan gambaran umum yang layak dibaca. Banyak orang menyukai PureMVC . Saya belum pernah menggunakannya, tetapi saya akan melihatnya saat berikutnya saya membutuhkan kerangka kerja MVC.

" Presenter First " adalah pendekatan pengembangan perangkat lunak yang menggabungkan ide pola desain Model View Presenter (MVP) dan pengembangan yang digerakkan oleh pengujian . Ini memungkinkan Anda memulai dengan menulis tes dalam bahasa pelanggan. Sebagai contoh:

"Saat saya mengklik tombol 'simpan' maka file akan disimpan dan peringatan file yang belum disimpan akan hilang.”

Saya tidak memiliki pengalaman menggunakan "Presenter First," tapi saya akan mencobanya ketika saya mendapat kesempatan, karena kelihatannya sangat menjanjikan.

Pertanyaan Stack Overflow lainnya yang mungkin ingin Anda lihat ada di sini dan di sini .

Jika Anda berpikir untuk menggunakan WPF pada titik mana pun, lihat pola Model-View ViewModel (MVVM) . Berikut adalah video yang sangat bagus yang harus Anda lihat: Jason Dolinger di Model-View-ViewModel .

Pola Desain MVVM (Model View View Model) untuk Winforms memberikan opsi lain yang dapat membuatnya lebih mudah untuk dikonversi ke WPF jika diperlukan. Magical.Trevor adalah contoh MVVM lain untuk Windows Forms yang juga menyertakan penjilidan otomatis berdasarkan nama properti.


Juga tanyakan pada diri Anda mengapa Anda menggunakan MVC.

  • Apakah Anda ingin dapat menguji kode unit sebanyak mungkin?
  • Apakah Anda mencoba mengizinkan sebanyak mungkin kode untuk digunakan kembali?
  • Apakah Anda mencoba membuat basis kode Anda mudah dipahami?
  • 101 alasan lain yang valid untuk proyek tertentu.

Setelah Anda jelas pada Anda tujuan , menjadi lebih mudah untuk memilih satu implementasi atau yang lain.

Ian Ringrose
sumber
@AgnelKurian, CAB adalah sekumpulan kode contoh dari Microsoft tentang cara membuat aplikasi - sekarang sebagian besar adalah sejarah.
Ian Ringrose
Ha ha! Ya, saya ingat "Blok Aplikasi" itu sekarang.
Agnel Kurian
45

PEMBARUAN: Selain jawaban saya sebelumnya di bawah, saya sarankan membaca tentang pendekatan "Presenter First" (terutama artikel PDF)

Saya akan merekomendasikan MVP (pola PassiveView sebenarnya) daripada MVC. Anda tidak benar-benar membutuhkan kerangka kerja khusus untuk ini, ini hanya bagaimana Anda mengatur kode Anda.

Salah satu pendekatan (yang biasanya saya ambil) adalah membagi setiap bentuk jendela menjadi tiga entitas:

  1. Kelas penyaji / pengontrol - inilah yang sebenarnya Anda mulai saat mengembangkan formulir. Di sinilah sebagian besar / semua logika "bisnis" Anda seharusnya berada.
  2. Tampilan antarmuka (IView), yang berisi metode, properti, dan peristiwa. Antarmuka ini adalah semua yang penyaji ketahui tentang formulir Anda.
  3. Pada akhirnya, setelah Anda selesai mengimplementasikan presenter dan view (termasuk pengujian unit), Anda kemudian dapat membuat kelas formulir yang sebenarnya dan membuatnya mengimplementasikan antarmuka IView. Maka itu hanya masalah menambahkan kontrol yang sesuai ke formulir dan menghubungkannya ke antarmuka.

Kode contoh (pseudocode sederhana, hanya untuk ilustrasi):

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;
}
Igor Brejc
sumber
7
Ini adalah implementasi varian MVP yang disebut PassiveView. Dalam tampilan pasif, tampilan tidak harus memilih presenternya. Untuk contoh serupa (tetapi dengan tampilan BENAR-BENAR pasif) periksa contoh ini danieleteti.it/?p=221 (contoh dalam bahasa Delphi)
Daniele Teti
6

Pernahkah Anda melihat PureMVC ? Saya telah menemukan bahwa tidak ada yang bisa menyetujui seperti apa MVC sebenarnya setelah mereka mulai membangun implementasi tertentu.

Pembaruan: Anda dapat membangun sendiri mulai dengan sesuatu yang lebih sederhana seperti MobileMVC . Kode Compact Framework harus mengkompilasi / menjalankan OK di Windows. Karena ini adalah tugas sekolah, saya sarankan agar Anda benar-benar meluangkan waktu untuk mempelajari cara kerja MVC.

Brian Lyttle
sumber
Saya memiliki tugas sekolah untuk aplikasi yang sangat sederhana untuk mengelola toko buku, dan saya sangat enggan menggunakan framework seperti PureMVC. Saya mencari sesuatu yang lebih sederhana.
kjv
3

Anda mungkin ingin melihat Eksekusi Diferensial .

Ini dia di SourceForge

IMO, ini adalah peningkatan besar pada MVC, meskipun masih sangat tidak biasa.

Mike Dunlavey
sumber
2

Contoh yang baik dalam menjalankan implementasi MVC Anda sendiri menggunakan Formulir Windows dapat ditemukan di sini . Kode sumber disertakan.

Saat Anda membaca, mempelajari, dan menulis kode untuk tugas ini, Anda akan menemukan banyak ketidaksepakatan tentang bagaimana MVC harus diimplementasikan. Yang ini adalah kasus sederhana yang mencerminkan pemisahan masalah serta contoh bagus dari 'pipa ledeng' yang diperlukan untuk menghubungkannya.

Ketika Anda keluar dari sekolah Anda mungkin ingin kembali ke kerangka kerja seperti yang direkomendasikan poster lain.

Gary.Ray
sumber
2

Blok Aplikasi Antarmuka Komposit Microsoft memulai hidupnya sebagai implementasi MVC (di antara pola lain yang diimplementasikan). Versi rilis, bagaimanapun, berkembang menjadi implementasi MVP, yang dapat dikatakan sebagai semacam interpretasi yang berbeda dari konsep MVC.

Jika Anda ingin memeriksa kode implementasi MVP yang sangat lengkap (dan entah bagaimana rumit), Anda dapat menemukan MS-CAB sebagai salah satu komponen dari Pabrik Perangkat Lunak Microsoft Smart Client. Itu datang dengan kode sumber. Anda bisa menemukannya di sini . Semoga berhasil!

Rui Craveiro
sumber