Após 2 anos, ainda estou lutando com o MVVM como um método prático de produção de software funcional. Em alguns casos, é ótimo. Eu fiz um aplicativo multithread que controlava uma pequena linha de montagem que teria sido um pesadelo sem conceitos de MVVM. Uma abstração da linha de montagem física era quase um acéfalo.
No entanto, minha carreira gira principalmente em torno de aplicativos de linha de negócios internos - formalizando e otimizando as operações de um negócio. Nesses aplicativos, geralmente há um nível de negócios que gira em torno de operações CRUD e compostas. Nos LOBs, meus modelos de exibição acabam sendo uma coleção muito simples de funções de wrapper de uma linha dos métodos de classe de negócios e, no final, acabam complicando apenas as tarefas mais simples, como mostrar uma caixa de mensagem ou abrir uma janela. Ninguém mais acha estranho quando as pessoas fazem longas descrições de "injeção de dependência" e "provedores de mensagens" para uma chamada Window.ShowDialog que existe há décadas? Quantas outras perguntas existem no estouro de pilha solicitando conselhos para tarefas extremamente simples em winforms?
Não me interpretem mal - eu entendo o MVVM e como isso pode ser inestimável para grandes equipes que desenvolvem horizontalmente um pacote de software comercializado e compactado. O teste de unidade dos modelos de exibição poderia economizar milhões, evitando um erro incorreto da RTM, e os desenvolvedores dedicados da interface do usuário poderiam proporcionar uma experiência rica. Mas quando o custo de reimplementação é mínimo e todos os negócios que se preocupam em pagar por um software de trabalho simples, por que devo gastar tempo testando a unidade de um "wrapper" simples vm quando minha lógica de negócios já está testada? Quanto tempo o negócio realmente me permite gastar em animações fofas e esquemas de cores? Ainda resta algo a ser feito por um desenvolvedor júnior (rastrear um bug em uma funcionalidade de salvamento que costumava ver "Save_Click",
É certo que eu realmente gosto da ligação de dados do WPF. Para tirar proveito disso, defino o contexto dos dados para a própria janela, onde ele tem acesso à classe de negócios e a quaisquer outras propriedades observáveis. Sim, eu quebro quase todas as "regras" do MVVM ao fazer isso. Mas pelo menos eu tenho um código orientado a eventos simples que é fácil de ler E aproveito a nova ligação de dados e validação. O problema está nos designers - que eu não uso muito, mas espero que agora estejam melhor integrados em 2012 - o designer mostra as centenas de propriedades que uma janela e suas classes base têm.
Para aqueles que podem se relacionar, você pode me indicar recursos, livros ou mesmo apenas mudanças de perspectiva que tornaram isso mais fácil de engolir. Darei outra chance ao MVVM, mas na última vez em que me senti estúpido por me preocupar com injeção de dependência apenas para mostrar uma caixa de mensagem de uma VM, não tinha intenção de testar a unidade. Mesmo se eu fizesse o teste de unidade, estamos realmente obtendo mais qualidade negociando testes de tempo de execução para erros de tempo de compilação daqueles temidos aplicativos "fortemente acoplados"?
Sei que uma resposta é apenas ficar em winforms. Mas como um dos últimos apoiadores do WebForms (eu tenho a mesma crítica da tendência do desenvolvimento da Web), eu me senti um dinossauro como quando descobri que não havia mais WebForms nos trilhos de certificação da Microsoft. Seguir em frente é a única opção, mesmo que eu não goste.