Tenho as seguintes camadas na minha solução:
- App.Domain
- App.Service
- App.Core (talvez você chame este de App.DataLayer)
- App.Web
O padrão de design de software não é minha pergunta. Tenho o seguinte modelo Domain
public class Foo {
public int Id {get;set;}
public int Name {get;set;}
public int Value {get;set;}
}
Quero usar esse modelo na visualização (por exemplo, página inicial) E quero usar Id, Name & Value
, portanto, se eu quiser criar o ViewModel, adicionarei o seguinte:
public class FooViewModel {
public int Id {get;set;}
public int Name {get;set;}
public int Value {get;set;}
}
Então, essa é uma boa ideia? ou apenas usar em Foo
vez de FooViewModel
?
asp.net-mvc
model
Mehdi Dehghani
fonte
fonte
Model
geralmente passado para oView
? Por que exatamente você precisa recriar os campos doModel
noView
? Se a separação de preocupações é uma metaMVC
, em que circunstâncias alguém gostaria de fazer a mesma coisa comModel
eView
? SeViewModel
são ambos, por que não estendendo / compondo ambosModel
eView
?Respostas:
Isso pode parecer uma violação da regra DRY inicialmente, mas eu argumentaria que "código semelhante e até idêntico" não é necessariamente "repetição" se fizer algo diferente ou puder mudar de forma independente. E no caso dos modelos de visualização, o código está definindo o que o "cliente" vê, não necessariamente as entidades e operações sobre as quais o negócio fala. Portanto, você costuma revelar modelos para o cliente ou interface que são "incidentalmente idênticos". Você pode alterar as regras e os termos comerciais ou a terminologia do usuário final independentemente um do outro.
Então, eu voltaria a pergunta para você. Se o domínio mudar, é aceitável que os clientes da "versão 1" continuem usando as interfaces antigas? Você nunca revelará termos ou operações na interface que não fazem parte das "principais regras de negócios?" E vice versa?
Esse tipo de pergunta em mente, se a "função" da sua exibição é estritamente para revelar o modelo de domínio subjacente, sim, isso parece violar a regra DRY.
Também tenha em mente, expor uma visão que muda mais naturalmente com as alterações do modelo também pode ser realizada em alguns idiomas com atributos e reflexão dos membros. (Ou com menos repetição em outros feitos de esperteza ... Mas, "esperteza" geralmente falha em justificar a repetição que ela poupa.)
fonte
Foo
, portanto, se eu usasseFoo
o ViewModel Além disso, o cliente também receberá novas propriedades. E se esse novo fosse um campo de segurança (talvez verdadeiro / falso para permissão ou algo parecido), o que devo fazer?User edit form
não precisamos passarIsAdmin
campo para o cliente, para manter esse campo seguro, então é com isso que me preocupo. desculpe pelo meu inglês ruim.Eu teria um modelo de exibição que continha apenas uma propriedade, uma instância do Foo. Dessa forma, você não está violando o DRY de acordo com qualquer definição, se o Foo mudar, seu modelo de visualização verá a alteração automaticamente e você ficará livre de uma ligação direta do modelo de visualização ao modelo.
Se amanhã for necessário que o view mostre algo mais, além do Foo, você pode simplesmente adicionar uma nova propriedade, e a intenção do seu modelo de view ainda será clara, ele contém um Foo e algo mais, você não terá uma mistura de propriedades da Foo com outras propriedades não relacionadas.
Eu não pensaria no seu modelo de visão como um FooViewModel, pensaria nele em termos do que a visão deveria exibir. Se ele exibir apenas um Foo, o modelo de visualização conterá uma propriedade, um Foo.
Não tenho certeza se expliquei isso claramente. Caso contrário, avise-me e tentarei reformulá-lo quando estiver acordado!
fonte
Eu diria que o uso
FooViewModel
dessa maneira viola o princípio DRY. Quando você precisa fazer uma alteração,Foo
também precisa fazer uma alteraçãoFooViewModel
. Eu acho que você seria melhor servido simplesmente usandoFoo
como modelo para a sua opinião. Eu consideraria um modelo de exibição se você precisar exibir coisas do Foo e outras coisas. Por exemplo, digamos que você precise renderizar algumas informações deFoo
e também deBar
.fonte
Foo
, então, porque eu também useiFoo
o ViewModel, também tenho que passar esse novo campo para o modo de exibição, acho que isso não é realmente um bom negócio, o que você acha ?Foo
eFooViewModel
. Geralmente, não é uma boa ideia ter que modificar vários arquivos para uma única alteração lógica.true/false
valor para permissão ou algo assim.