Implementacja MVC z Windows Forms

Gdzie mogę znaleźć dobry przykład jak w pełni zaimplementować wzorzec MVC w Windows Forms?

Znalazłem wiele samouczków i przykładów kodu na różnych stronach (na przykład projekt kodu i .NetHeaven), ale wiele z nich jest bardziej reprezentatywnych dla wzorca obserwatora niż MVC. Ponieważ aplikacja, którą chcę rozwijać jest dla projektu szkolnego, niechętnie używam frameworków takich jak PureMVClub MVC#.

Author: ardila, 2009-03-17

6 answers

Jestem zdania, że aplikacje są tak różne od siebie, a nasze zrozumienie, jak aplikacje powinny być pisane, jest nadal bardzo ograniczone. Poprzednie Aplikacje Windows Forms, nad którymi pracowałem, różniły się od siebie tak bardzo. Niektóre z różnic konstrukcyjnych, które widziałem, to (w tym większość kombinacji):

  • bezpośrednio rozmawiać z bazą danych (2 warstwy)
  • Użyj backendu, który został napisany dla podanej aplikacji (warstwa 3)
  • Użyj zestawu usług internetowych które zostały napisane do użytku przez wiele aplikacji i nie można ich zmienić dla Twojej aplikacji. (Architektura zorientowana na usługi)
  • Aktualizacje wykonywane przez CRUD operacje
  • 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 jest "podobna do tabeli" (np. faktury), które działają dobrze w standardowych kontrolkach siatki / wymagają niestandardowych kontrolek dla większości dane interfejsu użytkownika.
  • W tym celu należy skontaktować się z Działem obsługi klienta.]}
  • wiele testów jednostkowych za pomocą mocks etc / brak testów jednostkowych

Dlatego nie wydaje mi się, aby możliwe było stworzenie jednej implementacji MVC (lub MVP), która zawsze dobrze pasuje.

Najlepsze posty, jakie widziałem naprawdęwyjaśniające MVC idlaczego system MVC jest zbudowany tak, jak jest, to seria"Build Your Own CAB" Jeremy ' ego D Millera . Po pracy choć to Ty powinien być w stanie zrozumieć swoje opcje o wiele lepiej. Należy również wziąć pod uwagę Inteligentne wytyczne dla klientów firmy Microsoft (CAB / Microsoft Composite Application Block). Jest to nieco skomplikowane, ale może działać dobrze w aplikacjach, które dobrze pasują.

Wybórimplementacji MVC/MVP dla projektu Winforms daje przegląd, który warto przeczytać. Wiele osób lubi PureMVC. Nigdy go nie używałem, ale spojrzę na niego następnym razem, gdy będę potrzebował MVC ramy.

"Presenter First " jest podejściem do tworzenia oprogramowania, które łączy idee wzorca projektowego Model View Presenter (MVP) iTest-driven development . Pozwala zacząć od pisania testów w języku klienta. Na przykład:

"po kliknięciu przycisku "Zapisz" następnie plik powinien być zapisany i niezapisane ostrzeżenie o pliku powinno zniknij."

Nie mam doświadczenia w używaniu "Presenter First", ale dam to próba, kiedy mam szansę, ponieważ wygląda bardzo obiecująco.

Inne pytania dotyczące przepełnienia stosu, na które możesz chcieć spojrzeć, to tutaj i tutaj .

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

MVVM (Model View View Model) wzorzec projektowy dla Winforms give inna opcja, która może ułatwić konwersję na WPF w razie potrzeby. Magiczne.Trevor to kolejna próbka MVVM Dla Windows Forms, która zawiera również automatyczne wiązanie oparte na nazwach właściwości.


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

  • Czy chcesz być w stanie przetestować jak najwięcej kodu?
  • Czy starasz się pozwolić na ponowne użycie jak największej ilości kodu?
  • Czy starasz się, aby Twoja baza kodu była łatwa do rozumiesz?
  • 101 innych powodów, które mogą być ważne dla danego projektu.

Gdy już wiesz o swoich celach , łatwiej jest wybrać jedną lub drugą implementację.

 111
Author: Ian Ringrose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:07

Aktualizacja: oprócz mojej poprzedniej Odpowiedzi poniżej, proponuję przeczytać o podejściu "prezenter pierwszy" (zwłaszcza artykuły PDF)

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

Jednym z sposobów (które zazwyczaj przyjmuję) jest podzielenie każdej formy okna na trzy byty:

  1. Klasa prezentera/kontrolera - to właśnie TY zacznij od opracowania formularza. Tutaj powinna znajdować się większość/cała Twoja "biznesowa" logika.
  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 końcu, po zakończeniu implementacji prezentera i widoku (w tym testów jednostkowych), możesz utworzyć rzeczywistą klasę formularza i sprawić, by zaimplementowała interfejs IView. To tylko kwestia dodania odpowiednie sterowanie do formularza i podłączenie ich do interfejsu.

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;
}
 45
Author: Igor Brejc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 17:49:55

Spojrzałeś na PureMVC ? Odkryłem, że nikt nie może się zgodzić na to, jak naprawdę wygląda MVC, gdy zacznie budować konkretną implementację.

Update: możesz zbudować swój własny, zaczynając od czegoś prostszego, takiego jak MobileMVC . Compact Framework code powinien skompilować / uruchomić OK w systemie Windows. Ponieważ jest to zadanie szkolne, sugerowałbym, abyś spędził trochę czasu na nauce, jak działa MVC.

 6
Author: Brian Lyttle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-23 00:50:02

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

Tutaj jest w SourceForge

IMO jest to ogromna poprawa w MVC, choć nadal jest dość nietypowa.

 3
Author: Mike Dunlavey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:41

Dobry przykład tworzenia własnej implementacji MVC przy użyciu formularzy Windows można znaleźć tutaj. Kod źródłowy jest dołączony.

Kiedy czytasz, studiujesz i piszesz kod do tego zadania, przekonasz się, że istnieje wiele nieporozumień co do sposobu implementacji MVC. Ten jest prostym przypadkiem, który odzwierciedla oddzielenie obaw, a także dobrym przykładem "hydrauliki" wymaganej do podłączenia tego.

Po skończeniu szkoły prawdopodobnie będziesz chciał powrót na ramy, jak zalecały inne plakaty.

 2
Author: Gary.Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-25 15:26:33

Microsoft Composite Interface Application block rozpoczął swoje życie jako implementacja MVC (m.in. implementowane przez niego wzorce). Wersja release ewoluowała jednak w implementację MVP, którą można argumentować jako rodzaj innej interpretacji koncepcji MVC.

Jeśli chcesz sprawdzić kod bardzo kompletnej (i jakoś skomplikowanej) implementacji MVP, możesz znaleźć MS-CAB jako jeden z komponentów Microsoft Smart Client Software Factory. Nadchodzi z kodem źródłowym. Możesz go znaleźć tutaj . Powodzenia!

 2
Author: Rui Craveiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-25 20:00:37