Implementando MVC com Windows Forms

102

Onde posso encontrar um bom exemplo de como implementar completamente o padrão MVC no Windows Forms?

Encontrei muitos tutoriais e exemplos de código em vários sites (por exemplo, The Code Project e .NetHeaven), mas muitos são mais representativos para o padrão do observador do que MVC. Como o aplicativo que desejo desenvolver é para um projeto escolar, estou relutante em usar estruturas como PureMVC ou MVC # .

kjv
fonte

Respostas:

115

Eu sou da opinião que os aplicativos são muito diferentes uns dos outros e nosso entendimento de como os aplicativos devem ser escritos ainda é muito limitado. Os aplicativos Windows Forms anteriores nos quais trabalhei eram muito diferentes uns dos outros. Algumas das diferenças de design que tenho visto são (incluindo a maioria das combinações):

  • Fale diretamente com o banco de dados (2 camadas)
  • Use um back-end que foi escrito para o aplicativo em questão (3 camadas)
  • Use um conjunto de serviços da web que foram escritos para uso por muitos aplicativos e não podem ser alterados para o seu aplicativo. (Arquitetura Orientada a Serviços)
  • Atualizações sendo feitas por operações CRUD
  • Atualizações sendo feitas com o padrão de comando (envio de comandos para o servidor backend)
  • Muitos usos de vinculação de dados / nenhum uso de vinculação de dados
  • A maioria dos dados sendo "como uma tabela" (por exemplo, faturas) que funcionam bem em controles de grade padrão / precisam de controles personalizados para a maioria dos dados da IU.
  • Um desenvolvedor / equipes de 10 ou 20 desenvolvedores (apenas na IU)
  • Muitos testes de unidade usando simulações etc / nenhum teste de unidade

Portanto, não acho que seja possível criar uma implementação de MVC (ou MVP) que sempre se encaixa bem.

Os melhores posts que vi realmente explicando MVC e por que um sistema MVC é construído da maneira que é, são a série "Build Your Own CAB" de Jeremy D Miller . Depois de trabalhar, você será capaz de entender muito melhor suas opções. O Guia de Smart Client da Microsoft (CAB / Microsoft Composite Application Block) também deve ser considerado. É um pouco complexo, mas pode funcionar bem para aplicativos que se encaixam bem.

Selecionando uma implementação MVC / MVP para um projeto Winforms fornece uma visão geral que vale a pena ler. Muitas pessoas gostam de PureMVC . Eu nunca usei, mas gostaria de examiná-lo na próxima vez que precisar de um framework MVC.

" Presenter First " é uma abordagem de desenvolvimento de software que combina as idéias do padrão de design Model View Presenter (MVP) e o desenvolvimento orientado a testes . Ele permite que você comece escrevendo testes no idioma do cliente. Por exemplo:

"Quando clico no botão 'Salvar', o arquivo deve ser salvo e o aviso de arquivo não salvo deve desaparecer.”

Não tenho experiência com o "Presenter First", mas vou tentar quando tiver oportunidade, pois parece muito promissor.

Outras questões do Stack Overflow que você pode querer ver estão aqui e aqui .

Se você está pensando em usar o WPF a qualquer momento, dê uma olhada no padrão Model-View ViewModel (MVVM) . Aqui está um vídeo muito bom que você deve dar uma olhada: Jason Dolinger em Model-View-ViewModel .

O padrão de design MVVM (Model View View Model) para Winforms oferece outra opção que pode facilitar a conversão para WPF, se necessário. Magical.Trevor é outro exemplo de MVVM para Windows Forms que também inclui ligação automática com base em nomes de propriedades.


Também pergunte a si mesmo por que está usando MVC.

  • Você deseja realizar o teste de unidade o máximo de código possível?
  • Você está tentando permitir que o máximo de código possível seja reutilizado?
  • Você está tentando tornar sua base de código fácil de entender?
  • 101 outros motivos que podem ser válidos para um determinado projeto.

Uma vez que seus objetivos são claros , fica mais fácil escolher uma implementação ou outra.

Ian Ringrose
fonte
@AgnelKurian, o CAB foi um conjunto de códigos de amostra da Microsoft sobre como criar aplicativos - agora é quase tudo história.
Ian Ringrose
Haha! Sim, eu me lembro daqueles "blocos de aplicativos" agora.
Agnel Kurian
45

ATUALIZAÇÃO: além da minha resposta anterior abaixo, sugiro a leitura sobre a abordagem "Apresentador primeiro" (especialmente os artigos em PDF)

Eu recomendaria MVP (padrão PassiveView na verdade) em vez de MVC. Você realmente não precisa de nenhuma estrutura especial para isso, é apenas como você organiza seu código.

Uma abordagem (que geralmente uso) é dividir cada formulário de janela em três entidades:

  1. Uma classe de apresentador / controlador - é com isso que você realmente começa ao desenvolver um formulário. É aqui que a maior parte / toda a sua lógica de "negócios" deve residir.
  2. Uma interface de visualização (IView), que contém os métodos, propriedades e eventos. Essa interface é tudo o que o apresentador sabe sobre o seu formulário.
  3. No final, quando terminar de implementar o apresentador e a visualização (incluindo testes de unidade), você pode criar a classe de formulário real e implementá-la na interface IView. Então, é apenas uma questão de adicionar controles apropriados ao formulário e conectá-los à interface.

Código de exemplo (um pseudocódigo simples, apenas para ilustração):

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
fonte
7
Esta é uma implementação da variante MVP chamada PassiveView. Na visão passiva, a visão não deve escolher seu apresentador. Para um exemplo semelhante (mas com uma visão REALMENTE passiva) verifique este exemplo danieleteti.it/?p=221 (exemplo em linguagem Delphi)
Daniele Teti
6

Você já olhou para PureMVC ? Descobri que ninguém pode concordar sobre como o MVC realmente se parece depois de começar a construir uma implementação específica.

Atualização: você pode construir seu próprio começando com algo mais simples, como MobileMVC . O código do Compact Framework deve compilar / executar OK no Windows. Como se trata de um trabalho escolar, sugiro que você realmente passe algum tempo aprendendo como o MVC realmente funciona.

Brian Lyttle
fonte
Tenho um trabalho escolar para um aplicativo muito simples de gerenciamento de livraria e estou bastante relutante em usar uma estrutura como o PureMVC. Estou procurando algo mais simples.
kjv
3

Você pode querer dar uma olhada em Execução Diferencial .

Aqui está no SourceForge

IMO, é uma grande melhoria no MVC, embora ainda seja bastante incomum.

Mike Dunlavey
fonte
2

Um bom exemplo de implementação de MVC usando Windows Forms pode ser encontrado aqui . O código-fonte está incluído.

Ao ler, estudar e escrever o código para esta tarefa, você descobrirá que existem muitas divergências sobre como o MVC deve ser implementado. Este é um caso simples que reflete a separação de interesses, bem como um bom exemplo do 'encanamento' necessário para conectá-lo.

Quando você estiver fora da escola, provavelmente vai querer recorrer a uma estrutura como os outros pôsteres recomendaram.

Gary.Ray
fonte
2

O bloco Microsoft Composite Interface Application começou sua vida como uma implementação MVC (entre outros padrões que implementou). A versão de lançamento, no entanto, evoluiu para uma implementação MVP, que pode ser considerada um tipo de interpretação diferente do conceito MVC.

Se você deseja verificar o código de uma implementação de MVP muito completa (e de alguma forma complexa), pode encontrar o MS-CAB como um dos componentes do Microsoft Smart Client Software Factory. Ele vem com o código-fonte. Você pode encontrar aqui . Boa sorte!

Rui Craveiro
fonte