Pergunta

Eu li alguns conselhos MVC no passado em relação a modelos que indicam que você não deve reutilizar os mesmos objetos de modelo para o domínio ea vista; mas eu não tenho sido capaz de encontrar alguém disposto a discutir por isso é ruim.

É minha opinião que a criação de dois modelos separados - um para o domínio, um para a visão - e, em seguida, o mapeamento entre eles cria um monte de duplicação, além de código de mapeamento tedioso (alguns dos quais podem ser aliviados por coisas como AutoMapper ) que provavelmente vai ser propenso a erros.

O que faz ter um modelo separado para a duas preocupações vale a pena de duplicação e mapeamento de código?

Foi útil?

Solução

No seu coração, dois modelos é sobre separação de interesses. Eu quero o meu Vista para trabalhar fora de um único modelo. Eu quero o meu modelo de domínio para representar o modelo conceitual eu construir com os especialistas de domínio. ViewModel muitas vezes tem limitações técnicas. Modelo de Domínio é sobre POCO, e não estar vinculado por limitações técnicas de ambos os dados mostrados (View) ou persistentes (em um DB ou não).

Suponha que eu tenho três entidades mostrados em uma tela. Será que essa necessidade eu quero dizer para forçar uma relação entre os três? Ou apenas criar um objeto componente ViewModel que contém todos os três itens. Com um ViewModel separado, Vista preocupações são separados do meu domínio.

Outras dicas

Por quê? Porque a vista não deve ter a capacidade de usar o objeto do modelo!

Imagine que você passar o projeto para um web designer para fazer a camada de visão. De repente, ele / ela tem a capacidade para cerca de mexer com os dados da sua aplicação através da camada de modelo. Isso não é bom.

Então, sempre só passar os dados a vista necessidades, em vez do objeto com métodos.

J.P. O artigo de Boodhoo href="http://codebetter.com/blogs/jean-paul_boodhoo/archive/2007/09/27/screen-bound-dto-s.aspx" DTOs vinculados vai ajudar você a entender o benefício design.

Há também um prestação da segurança que eu tenho escrito aproximadamente.

Ter um modelo de apresentação simplifica os seus pontos de vista. Isto é especialmente importante porque vistas são normalmente muito difíceis de teste. Por ter um modelo de apresentação de mover um monte de trabalho fora da vista e para o domínio-> modelo de apresentação. Coisas como a formatação, a manipulação valores nulos e achatamento gráficos de objeto.

Eu concordo que o mapeamento extra é uma dor, mas eu acho que você provavelmente precisará tentar ambas as abordagens em seu contexto específico para ver o que funciona melhor para você.

Há preocupações mais claras mesmo incluindo a capacidade do modelo de vista a ser especialmente formatados e certamente nulo-safe.

Eu acho que a idéia é que os seus modelos de domínio pode estender-se a outras implementações, não apenas a sua aplicação MVC e que iria quebrar as seperations de preocupações princípio. Se o seu Ver modelo é o seu modelo de domínio, em seguida, seu modelo de domínio tem duas razões para a mudança:. Uma exigência mudança de domínio e uma mudança exigência vista

Parece que tenho a duplicação de regras bem.

ie. validação objeto cliente na interface do usuário, em seguida, mapear a objeto de domínio que tem de ser validado.

O que eu tendem a fazer, porém, é mapear o meu conjunto de objetos de domínio para criar um modelo - ie. uma página que mostra informações de clientes, informações de estoque, etc ... o meu modelo torna-se uma estrutura que contém um objeto Customer e uma da objeto.

CompanyPageModel

Cliente pública Cliente {get;} público Stock da {get;}

, em seguida, no meu projeto MVC ViewData.Model.Customer.Name ViewData.Model.Stock.CurrentStocks

Separação 'parece' como mais trabalho, mas mais tarde, é bom ter essa divisão de modelo UI / Domínio ... meio como escrever testes:)

bebi o cool-assessor, finalmente, eu gosto de ser capaz de marcar o meu viewmodel com instruções de exibição e têm que toda a auto cabeada.

O que eu exijo agora é algum tipo de gerador de auto de viewmodels de entidades poco. Eu sempre definir uma string como um int e isso me leva uma eternidade para encontrá-lo. Nem sequer pensar em fazer isso sem AutoMapper a menos que você gosta de dor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top