Implementowanie MVC z Windows Forms

102

Gdzie mogę znaleźć dobry przykład pełnego zaimplementowania wzorca MVC w Windows Forms?

Znalazłem wiele samouczków i przykładów kodu w różnych witrynach (na przykład The Code Project i .NetHeaven), ale wiele z nich jest bardziej reprezentatywnych dla wzorca obserwatora niż MVC. Ponieważ aplikacja, którą chcę stworzyć, jest przeznaczona do projektu szkolnego, niechętnie używam frameworków, takich jak PureMVC czy MVC # .

kjv
źródło

Odpowiedzi:

115

Uważam, że aplikacje tak bardzo się od siebie różnią, a nasze rozumienie tego, jak powinny być pisane, jest nadal bardzo ograniczone. Wcześniejsze aplikacje Windows Forms, nad którymi pracowałem, bardzo się od siebie różniły. Niektóre z różnic konstrukcyjnych, które zauważyłem, to (w tym większość kombinacji):

  • Rozmawiaj bezpośrednio z bazą danych (poziom 2)
  • Użyj zaplecza, który został napisany dla danej aplikacji (3 warstwy)
  • Użyj zestawu usług internetowych, które zostały napisane do użytku przez wiele aplikacji i nie można ich zmienić w aplikacji. (Architektura zorientowana na usługi)
  • Aktualizacje wykonywane przez operacje CRUD
  • Aktualizacje wykonywane za pomocą wzorca poleceń (wysyłanie poleceń do serwera zaplecza)
  • Wiele zastosowań wiązania danych / brak zastosowań wiązania danych
  • Większość danych ma charakter „tabelaryczny” (np. Faktury), które działają dobrze w standardowych kontrolkach siatki / wymagają niestandardowych kontroli dla większości danych interfejsu użytkownika.
  • Jeden programista / zespoły składające się z 10 lub 20 programistów (tylko w interfejsie użytkownika)
  • Wiele testów jednostkowych przy użyciu makiet itp. / Brak testów jednostkowych

Dlatego nie sądzę, aby można było stworzyć jedną implementację MVC (lub MVP), która zawsze będzie dobrze pasować.

Najlepsze posty, jakie widziałem, naprawdę wyjaśniające MVC i dlaczego system MVC jest zbudowany tak, jak jest, to seria „Zbuduj własną CAB” autorstwa Jeremy'ego D. Millera . Po przepracowaniu tego powinieneś być w stanie znacznie lepiej zrozumieć swoje opcje. Należy również wziąć pod uwagę wskazówki dotyczące inteligentnego klienta firmy Microsoft (CAB / Microsoft Composite Application Block) . Jest to trochę skomplikowane, ale może dobrze działać w aplikacjach, które są dobrze dopasowane.

Wybór implementacji MVC / MVP dla projektu Winforms daje przegląd, który warto przeczytać. Wiele osób lubi PureMVC . Nigdy go nie używałem, ale przyjrzę się temu następnym razem, gdy będę potrzebował frameworka MVC.

Presenter First ” to podejście do tworzenia oprogramowania, które łączy idee wzorca projektowego Model View Presenter (MVP) z programowaniem opartym na testach . Pozwala zacząć od napisania testów w języku klienta. Na przykład:

„Kiedy kliknę przycisk„ Zapisz ”, plik powinien zostać zapisany, a ostrzeżenie o niezapisanym pliku powinno zniknąć.”

Nie mam doświadczenia w używaniu „Presenter First”, ale spróbuję, kiedy będę miał okazję, ponieważ wygląda to bardzo obiecująco.

Inne pytania dotyczące przepełnienia stosu, na które możesz chcieć przyjrzeć się, są tutaj i tutaj .

Jeśli myślisz o użyciu WPF w dowolnym momencie, spójrz na wzorzec Model-View ViewModel (MVVM) . Oto bardzo dobry film, który powinieneś obejrzeć: Jason Dolinger on Model-View-ViewModel .

Wzorzec projektowy MVVM (Model View View Model) dla Winforms daje inną opcję, która może ułatwić konwersję do WPF, jeśli zajdzie taka potrzeba. Magical.Trevor to kolejny przykład MVVM dla Windows Forms, który zawiera również automatyczne wiązanie na podstawie nazw właściwości.


Zadaj sobie również pytanie, dlaczego używasz MVC.

  • Czy chcesz mieć możliwość przetestowania jak największej ilości kodu?
  • Czy próbujesz pozwolić na ponowne wykorzystanie jak największej ilości kodu?
  • Czy starasz się, aby baza kodu była łatwa do zrozumienia?
  • 101 innych powodów, które mogą być ważne dla danego projektu.

Gdy już jasno określisz swoje cele , łatwiej będzie wybrać taką czy inną implementację.

Ian Ringrose
źródło
@AgnelKurian, CAB był zbiorem przykładowego kodu firmy Microsoft pokazującego, jak budować aplikacje - to teraz głównie historia.
Ian Ringrose
Ha ha! Tak, teraz pamiętam te „Bloki aplikacji”.
Agnel Kurian
45

AKTUALIZACJA: Oprócz mojej poprzedniej odpowiedzi poniżej, proponuję przeczytać o podejściu „Najpierw prezenter” (zwłaszcza artykuły PDF)

Poleciłbym MVP (właściwie wzorzec PassiveView) zamiast MVC. Tak naprawdę nie potrzebujesz do tego żadnych specjalnych frameworków, chodzi tylko o to, jak organizujesz swój kod.

Jedno podejście (które zwykle stosuję) polega na podzieleniu każdego formularza okna na trzy jednostki:

  1. Klasa prezentera / kontrolera - od tego właściwie zaczynasz podczas tworzenia formularza. W tym miejscu powinna znajdować się większość / cała logika „biznesowa”.
  2. Interfejs widoku (IView), który zawiera metody, właściwości i zdarzenia. Ten interfejs to wszystko , co prezenter wie o Twoim formularzu.
  3. Na koniec, kiedy zakończysz wdrażanie prezentera i widoku (w tym testów jednostkowych), możesz stworzyć właściwą klasę formularza i sprawić, by implementowała interfejs IView. Następnie wystarczy dodać odpowiednie kontrolki do formularza i połączyć je z interfejsem.

Przykładowy kod (prosty pseudokod, tylko dla ilustracji):

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
źródło
7
Jest to implementacja wariantu MVP o nazwie PassiveView. W biernym widoku widok nie powinien wybierać swojego prezentera. Aby zapoznać się z podobnym przykładem (ale z widokiem NAPRAWDĘ pasywnym), sprawdź ten przykład danieleteti.it/?p=221 (przykład w języku Delphi)
Daniele Teti
6

Czy spojrzałeś na PureMVC ? Odkryłem, że nikt nie może się zgodzić co do tego, jak naprawdę wygląda MVC, gdy zaczną budować określoną implementację.

Aktualizacja: możesz zbudować własny, zaczynając od czegoś prostszego, takiego jak MobileMVC . Kod Compact Framework powinien kompilować / działać poprawnie w systemie Windows. Ponieważ jest to zadanie szkolne, sugerowałbym, abyś poświęcił trochę czasu na naukę, jak naprawdę działa MVC.

Brian Lyttle
źródło
Mam zadanie szkolne na bardzo prostą aplikację do zarządzania księgarnią i raczej niechętnie używam frameworka takiego jak PureMVC. Szukam czegoś prostszego.
kjv
3

Możesz rzucić okiem na wykonanie różnicowe .

Tutaj jest w SourceForge

IMO, to ogromna poprawa w stosunku do MVC, choć nadal jest dość niezwykła.

Mike Dunlavey
źródło
2

Dobry przykład toczenia własnej implementacji MVC przy użyciu Windows Forms można znaleźć tutaj . Zawiera kod źródłowy.

Czytając, studiując i pisząc kod tego zadania, odkryjesz, że istnieje wiele nieporozumień dotyczących sposobu implementacji MVC. Jest to prosty przypadek, który odzwierciedla oddzielenie obaw, a także dobry przykład „hydrauliki” wymaganej do połączenia.

Kiedy jesteś poza szkołą, prawdopodobnie będziesz chciał wrócić do schematu, który zalecał inne plakaty.

Gary.Ray
źródło
2

Blok aplikacji Microsoft Composite Interface Application rozpoczął swoje życie jako implementacja MVC (wśród innych zaimplementowanych wzorców). Wydana wersja ewoluowała jednak w implementację MVP, co można uznać za rodzaj innej interpretacji koncepcji MVC.

Jeśli chcesz sprawdzić kod bardzo kompletnej (i nieco złożonej) implementacji MVP, możesz znaleźć MS-CAB jako jeden ze składników Microsoft Smart Client Software Factory. Pochodzi z kodem źródłowym. Znajdziesz go tutaj . Powodzenia!

Rui Craveiro
źródło