J'ai les couches suivantes dans ma solution:
- App.Domain
- App.Service
- App.Core (vous appelez peut-être celui-ci App.DataLayer)
- App.Web
Le modèle de conception de logiciel n'est pas ma question, j'ai le modèle suivant Domain
public class Foo {
public int Id {get;set;}
public int Name {get;set;}
public int Value {get;set;}
}
Je veux utiliser ce modèle sur la vue (par exemple la page d'accueil) ET je veux utiliser Id, Name & Value
, donc si je veux créer ViewModel, j'ajouterai ce qui suit:
public class FooViewModel {
public int Id {get;set;}
public int Name {get;set;}
public int Value {get;set;}
}
Alors, c'est une bonne idée? ou simplement utiliser à la Foo
place de FooViewModel
?
asp.net-mvc
model
Mehdi Dehghani
la source
la source
Model
généralement transmis auView
? Pourquoi avez-vous exactement besoin de recréer les champs duModel
dans leView
? Si la séparation des préoccupations est un objectifMVC
, dans quelles circonstances voudrait-on faire la même chose avecModel
etView
? SiViewModel
c'est les deux, pourquoi ne pas étendre / composer les deuxModel
etView
?Réponses:
Cela peut ressembler à une violation de la règle DRY au départ, mais je dirais qu'un code "similaire, voire identique" n'est pas nécessairement une "répétition" s'il fait quelque chose de différent ou s'il peut changer indépendamment. Et dans le cas des modèles de vue, le code définit ce que le «client» voit, pas nécessairement les entités et les opérations dont parle l'entreprise. Ainsi, vous dévoilez souvent au client ou à l'interface des modèles qui sont en quelque sorte "incidemment identiques". Vous pouvez modifier les règles et conditions commerciales ou la terminologie de l'utilisateur final indépendamment les uns des autres.
Donc, je vous retourne la question. Si le domaine change, est-il acceptable pour les clients "version 1" de continuer à utiliser les anciennes interfaces? Révélerez-vous jamais des termes ou des opérations dans l'interface qui ne font pas partie des "règles métier de base"? Et vice versa?
Ce genre de questions à l'esprit, si la "fonction" de votre vue est strictement de révéler le modèle de domaine sous-jacent, oui, cela semble violer la règle DRY.
Gardez également à l'esprit que l'exposition d'une vue qui change plus naturellement avec les changements de modèle peut également être effectuée dans certaines langues avec des attributs de membre et une réflexion. (Ou avec moins de répétition par d'autres exploits d'intelligence ... Mais, "l'intelligence" échoue souvent à justifier la répétition qu'elle vous épargne.)
la source
Foo
, donc si je l'utilisaisFoo
comme ViewModel aussi, le client obtiendra également une nouvelle propriété, alors qu'en est-il si ce nouveau domaine était un domaine de sécurité (peut-être vrai / faux pour la permission, ou quelque chose comme ça), que dois-je faire?User edit form
, nous n'avons pas besoin de transmettre leIsAdmin
champ au client, pour garder ce champ sécurisé, c'est donc ce qui m'inquiète. Désolé pour mon mauvais anglais.J'aurais un modèle de vue qui contenait une seule propriété, une instance de Foo. De cette façon, vous ne violez DRY selon aucune définition de celui-ci, si Foo change, votre modèle de vue voit automatiquement le changement, et vous vous laissez libre d'une liaison directe du modèle de vue au modèle.
Si demain il est nécessaire que la vue montre autre chose ainsi que le Foo, vous pouvez simplement ajouter une nouvelle propriété, et l'intention de votre modèle de vue sera toujours claire, il contient un Foo et autre chose, vous n'aurez pas un mélange de propriétés de Foo avec d'autres propriétés indépendantes.
Je ne considérerais pas votre modèle de vue comme un FooViewModel, je le considérerais en termes de ce que la vue est censée afficher. S'il n'affiche qu'un Foo, le modèle de vue contient une propriété, un Foo.
Je ne sais pas si je l'ai expliqué clairement. Sinon, faites-le moi savoir et je vais essayer de le reformuler quand je suis réveillé!
la source
Je dirais que l'utilisation
FooViewModel
de cette manière viole le principe DRY. Lorsque vous devez apporter une modification,Foo
vous devez également effectuer une modificationFooViewModel
. Je pense que vous seriez mieux servi simplement en utilisantFoo
comme modèle votre point de vue. Je considérerais un modèle de vue si vous avez besoin d'afficher des choses de Foo et quelque chose d'autre. Par exemple, supposons que vous ayez besoin de restituer certaines informations à partirFoo
et à partir deBar
.la source
Foo
, donc parce que j'aiFoo
aussi utilisé comme ViewModel, donc je dois aussi passer ce nouveau champ à la vue, je pense que ce n'est pas vraiment une bonne affaire, qu'en pensez-vous ?Foo
etFooViewModel
. Généralement, ce n'est pas une bonne idée de devoir modifier plusieurs fichiers pour une seule modification logique.true/false
valeur d'autorisation ou quelque chose comme ça.