ASP.net MVC - os M, V e C do MVC devem estar cientes explicitamente das entidades do domínio?

8

Como essa pergunta parece ser bastante subjetiva, estou postando aqui.

Vamos dizer que você está escrevendo sua própria versão de Stackoverflow utilizando ASP.NET MVC, por isso há classes como Question, Answer, User, etc. Uma vez que você é preguiçoso, você decidiu usar estrutura de entidade. Portanto, todas as classes mencionadas acima têm propriedades de navegação: Questionsabe o que é Answers, Answersabe Userquem o postou etc.

Você leu muitos livros de Martin Fowler, portanto, com certeza, terá uma camada de serviço para implementar toda a lógica de negócios lá. Você usará o ASP.NET MVC apenas para a funcionalidade relacionada à lógica da interface do usuário e do aplicativo.

Existem 2 perguntas:

  1. Você irá expor diretamente objetos de Question, Answere outros para os controladores?
  2. Você fará o mesmo para visualizações?

Basicamente, não fornecerei uma API REST para o meu aplicativo, nem sou muito conservador para ter algum medo como "ei, o MY VIEW está ciente do que Questioné, não sei se é ruim ou não, Eu simplesmente não gosto! ".

Estou especialmente curioso sobre o caso em que a Questionclasse tem um campo como TimePostede você vincula sua PostNewQuestionvisão a essa classe. Sei que, caso não esteja vinculando esse campo a nenhum controle da página, ele não será publicado, portanto, o campo será definido nullquando tiver o objeto no lado do controlador. É considerado bom ou é uma má ideia? Estou pensando em duas abordagens opostas: "usando DTOs / ViewModels em todos os lugares" e "wtf, menos classes são sempre melhores!"

O que você acha que é uma abordagem correta ? (Eu sei que não há resposta direta, então a questão é: "o que se deve considerar para decidir se os DTOs / ViewModels / O que mais é bom para a arquitetura do aplicativo?")

Observe também que estamos considerando um clone muito simplificado do Stackoverflow, portanto:

  1. É um projeto somente para web (não vamos expor a API REST ou qualquer outra coisa)
  2. Existem usuários, perguntas, respostas, tags e funcionalidade de pesquisa (sem lógica comercial excepcional)
  3. Existem cerca de 100 usuários ativos por dia (sem requisitos especiais de desempenho)
  4. O código deve ser legível e não deve haver surpresas ou locais de interesse especial no caso de um novo membro ingressar na equipe de desenvolvimento.

Você também pode expressar sua opinião, caso algum dos três primeiros pontos seja alterado - "o cliente agora quer que nosso serviço permita 10000 usuários simultâneos" ou "agora precisamos apenas permitir que cada usuário publique uma vez a cada 15 minutos", etc.

Obrigado!

Andrey Agibalov
fonte

Respostas:

3

Não trabalhei muito com o MVC, no entanto, trabalhei muito com o MVVM e aqui está minha opinião:

Question,, Answere Usersão todos os objetos de dados. Não há problema em eles se conhecerem, mas não devem estar cientes de nada fora da camada do objeto de dados, como Views, Controllers, ViewModels etc.

Em um mundo ideal, sua exibição faz referência apenas aos modelos. Eles podem conhecer o controlador, mas não devem ter que fazer referência diretamente a ele. O ViewModel conhece apenas outros modelos. O controlador conhece os modelos e os modelos de exibição. Ele não se importa com o View, mesmo que ele forneça o View com ViewModels ou Models.

Então seus objetos acabam assim:

  • Os modelos vêm em duas variedades: modelos e modelos de exibição.

    • Modelos são objetos de dados simples que simplesmente existem para armazenar dados e geralmente refletem os dados do banco de dados. Eles não acessam o banco de dados ou contêm qualquer tipo de lógica comercial que não esteja relacionada a eles.
    • ViewModels são objetos de dados que contêm dados que o View precisa, não necessariamente o que o banco de dados precisa. Eles podem conter modelos, embora os modelos não devam conter os modelos de exibição.
  • Os controladores contêm sua lógica de negócios. Eles controlam as chamadas de acesso a dados, criando Models / ViewModels para passar para o View, lógica de negócios avançada, como permissões, etc. Eles basicamente controlam toda a camada de código.

  • As visualizações são usadas apenas para fornecer aos usuários uma interface amigável. Eles aceitam um ViewModel ou Model e o exibem de uma maneira que seja agradável ao usuário.

Rachel
fonte
MVVM realmente não faz sentido em um projeto web ...
yannis
1
@YannisRizos Este não é o MVVM, é o MVC. O MVC também possui ViewModels, mas eles fazem parte da camada Model. Eles são essencialmente modelos para as visualizações, não sua própria camada que contém lógica de negócios (que é o que eles seriam no MVVM). Na verdade, eu não recomendaria o uso do MVVM, a menos que você esteja trabalhando com o WPF / Silverlight.
Rachel