Implementando o MVC com o Windows Forms

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

Eu 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 de observador do que MVC. Como o aplicativo que quero desenvolver é para um projeto de escola, estou relutante em usar estruturas como PureMVC ou MVC # .

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

  • Diretamente falar com o database (2 camadas)
  • Use um backend que foi escrito para o aplicativo fornecido (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 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 (enviando comandos para o servidor backend)
  • Muitos usos de vinculação de dados / nenhum uso de vinculação de dados
  • A maioria dos dados que são “semelhantes a tabelas” (por exemplo, faturas) que funcionam bem em controles de grade padrão / exigem controles personalizados para a maioria dos dados da interface do usuário.
  • Um desenvolvedor / equipes de 10 ou 20 desenvolvedores (apenas na interface do usuário)
  • Muitos testes de unidade usando simuladores etc / sem testes unitários

Portanto, eu não acho que é possível criar uma implementação do MVC (ou MVP) que sempre se encheckbox bem.

Os melhores posts que eu vi realmente explicando MVC e porque um sistema MVC é construído do jeito que é, é a série “Build Your Own CAB”, de Jeremy D Miller . Depois de trabalhar, você deve ser capaz de entender melhor as suas opções. O Smart Client Guidance da Microsoft (CAB / Microsoft Composite Application Block) também deve ser considerado. É um pouco complexo, mas pode funcionar bem para aplicativos que tenham um bom ajuste.

Selecionar uma implementação de MVC / MVP para um projeto do WinForms fornece uma visão geral que vale a pena ser lida. Muitas pessoas gostam do PureMVC . Eu nunca usei isso, mas eu olharia para ele na próxima vez que eu precisasse de um framework MVC.

” Presenter First ” é uma abordagem de desenvolvimento de software que combina as idéias do padrão de design do 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.”

Eu não tenho experiência em usar “Presenter First”, mas vou tentar quando tiver uma chance, pois parece muito promissor.

Outras questões de estouro de pilha 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 .

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


Também se pergunte por que você está usando o MVC.

  • Você deseja ser capaz de testar o máximo de código possível?
  • Você está tentando permitir que o código seja reutilizado?
  • Você está tentando tornar sua base de código fácil de entender?
  • 101 outras razões que podem ser válidas para um determinado projeto.

Uma vez que você esteja claro sobre seus objectives , fica mais fácil escolher uma implementação ou outra.

UPDATE: Além da minha resposta anterior abaixo, sugiro ler sobre a abordagem “Presenter First” (especialmente os artigos em PDF)

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

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

  1. Uma class de apresentador / controlador – isso é o que você realmente inicia ao desenvolver um formulário. É aqui que a maior parte / toda a lógica do seu “negócio” deve residir.
  2. Uma interface de visualização (IView), que contém os methods, propriedades e events. Essa interface é tudo o que o apresentador sabe sobre seu formulário.
  3. No final, quando você concluir a implementação do apresentador e da visualização (incluindo testes de unidade), você poderá criar a class de formulário real e implementá-la. Então é só uma questão de adicionar controles apropriados ao formulário e conectá-los à interface.

Exemplo de código (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; } 

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

Atualização: Você pode criar seu próprio começo com algo mais simples, como o MobileMVC . O código do Compact Framework deve compilar / executar o OK no Windows. Como essa é uma tarefa da escola, sugiro que você passe algum tempo aprendendo como o MVC realmente funciona.

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

Aqui está no SourceForge

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

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

Ao ler, estudar e escrever código para essa tarefa, você descobrirá que há 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 ligar isso.

Quando você está fora da escola, você provavelmente vai querer recorrer a um quadro como os outros cartazes recomendam.

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

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