2010-02-07 9 views
12

Quelqu'un dans Silverlight posted qui MVVM manque actuellement de normalisation afin que tout le monde a sa propre saveur ..MVVM normalisation

Voilà pourquoi moi et quelques gars de WPF disciples discutent activement les éléments de MVVM que tout le monde d'accord. Je comprends parfaitement que nous avons implémenté le pattern de différentes manières et nous avons mixé les différents motifs ou créé notre propre pattern en fonction des besoins de notre projet ou pour faciliter la vie des développeurs. Mais oubliez ces difficultés ou le besoin particulier de votre projet . Discutons des règles standard du modèle MVVM que tout le monde a accepté. J'ai également posté some of my thoughts here.

Pourquoi MVVM?

  • Testabiltiy (ViewModel est plus facile de test unitaire que le code-behind ou d'un événement de code entraîné)
  • de seperation claire entre concepteur UX et développeur
  • Augmente la « blendability » de votre vue
  • Modèle jamais a besoin d'être changé pour appuyer les changements à la vue
  • ViewModel a rarement besoin d'être changé pour appuyer les changements à la vue
  • Aucun code dupliquée pour mettre à jour des vues

Do et Do pas Voir

  • ne doit pas contenir toute logique que vous voulez tester: Comme Glenn dit que MVVM est pas l'exercice à compter de code, nous pouvons écrire le code dans le code -derrière. Mais vous ne devriez jamais écrire de logique que vous voulez tester. Par exemple: Si vous sélectionnez un pays, vous voulez afficher la liste des états ou des villes dans votre vue. C'est l'exigence de l'entreprise, donc vous devriez avoir un test unitaire pour tester cette logique. Donc, vous ne devriez pas l'écrire en code-behind.
  • peut être un contrôle ou un modèle de données
  • Gardez la vue aussi simple que possible. : Nous pouvons toujours utiliser Data Trigger ou Value Converter ou Visual State ou Blend Behivor dans XAML avec soin.
  • utilisation propriété jointe si quelque chose ne peut être liée:

Do et Do pas ViewModel

  • Connecteur entre Voir et modèle
  • Conserver l'état d'affichage, la valeur de conversion (Vous pouvez Créez la structure de données que vous souhaitez afficher dans ViewModel au lieu d'utiliser ValueConverter Par exemple: Vous devez afficher le nom au lieu du prénom et du nom Votre modèle peut avoir le prénom et le nom mais vous pouvez créer la propriété Name dans ViewModel.)
  • Aucune référence forte ou faible (via l'interface) de vue
  • Faire VM testable que possible (par exemple, pas d'appel à la classe Singleton)
  • Aucun contrôle lié enfouissent VM (Parce que si vous changez la vue alors vous devrez également changer de VM.)

Modèle

  • peut être modèle de données, DTO, POCO, proxy généré automatiquement de la classe de domaine et l'interface utilisateur modèle basé sur la façon dont vous voulez avoir la séparation entre les services de domaine et la couche Présentation
  • Aucune référence à ViewModel

avez-vous des suggestions ou des commentaires à ce sujet?

Nous avons un désaccord dans notre groupe. Certains ont dit que c'est bien d'avoir l'interface de View dans ViewModel. Mais certains ont dit que si View Model a l'interface de View alors ce sera MVP pattern.

L'un de nos experts MVVM disent MVVM Vs MVP

View => ViewModel

  • MVVM la vue est directement lié à la ViewModel et parle à la machine virtuelle par liaison de données
  • En MVP, la vue est liée à un modèle suspendu au SupervisionController ou non lié (vue passive).

ViewModel => Voir

MVVM

  1. INPC/propriété de liaison
  2. Events
  3. Messages (cadre de l'événement Aggregator/Messenger/RX)
  4. par un intermédiaire comme un service
  5. Par le biais d'une interface
  6. Par l'intermédiaire des délégués (la vue transfère les délégués à la machine virtuelle qu'elle peut utiliser pour la rappeler. Par exemple, VM peut exposer une méthode SetActions que la vue appelle en lui transmettant des délégués.

MVP

Dans le cas MVP la norme est les pourparlers de présentateur revenir à la vue, soit par une interface, databinding, ou par des propriétés dans le cas de vue passif. Avec Passive View, les propriétés n'utilisent pas la liaison de données, mais les getters et setters de propriété de vue sont utilisés pour définir directement la valeur du contrôle.

Que pensez-vous de cette idée?

Pensez-vous que ViewModel a l'interface de View?

Si vous souhaitez ajouter plus vous êtes invités à ajouter ... :)

L'idée sur ce poste est d'obtenir la même compréhension du modèle MVVM dans la Communauté.

+0

Je pense que cette question devrait être un Wiki communautaire. – chakrit

+0

bien sûr .. comment déplacer cette question au Wiki communautaire? Désolé pour ça .. Quelqu'un peut-il m'aider à le déplacer? ou S'il vous plaît laissez-moi savoir la façon de le déplacer. Merci. –

+0

Je pense que c'est trop un argument pour vivre même comme cwiki, mais nous verrons ce que les autres pensent. – bmargulies

Répondre

2

J'aime ce que vous avez écrit.Une des choses qui me dérange vraiment est que beaucoup de gens semblent avoir leur VM couplée très étroitement à leur vue - si vous faites ceci alors vous pourriez tout aussi bien faire le vieux XAML + tout ce qui est bloqué dans le code derrière chose.

Le motif que j'utilise est une légère variante du MVVM (mais il est généralement le même). Personnellement, j'aime que mon ViewModel soit donné à la vue en tant qu'interface - il garde la séparation très propre. Cela a beaucoup d'avantages lorsque vous faites des prototypes, les éléments visuels peuvent être commutés dans ou hors de la vue avec peu ou pas d'impact sur le ViewModel.

+0

merci. dans l'espoir d'obtenir des contributions d'experts ici. mais ppl ne sont pas tellement intéressés par cela. :) –

+0

J'aimerais voir comment vous utilisez le viewmodel en tant qu'interface et le lier à votre vue sans rompre le modèle MVVM et ne pas mettre des charges de code dans le codebehind de votre vue. –

+1

@RafaelFernandes Tout cela est facilement réalisable, surtout si vous utilisez Unity ou l'un des produits similaires. Si la VM est injectée sur le constructeur de la vue alors tout ce dont vous avez besoin est une ligne de code dans le code derrière la vue: 'this.DataContext = myViewModel;'. Codebehind est aussi parfaitement bien tant qu'il est lié à la vue et que vous ne faites pas des choses qui devraient être faites par liaison (code zéro derrière est comme un pot d'or à la fin de l'arc en ciel - idéaliste mais en grande partie irréalisable sauf dans le la plus basique des applications). – slugster

0

Je pense que la communication entre View ViewModel via la liaison de données est ce qui rend MVVM son propre modèle par opposition à d'autres séparation des préoccupations. Ce n'est pas tant si c'est bon ou mauvais pour le vm de connaître la vue via l'interface, mais dans le contexte de la communication du motif utilisé ce n'est pas MVVM.

Une partie de la difficulté à obtenir et à maintenir des normes réside dans les défauts et la complexité de WPF et Silverlight, malheureusement. Quand il y a plusieurs normes valides cependant, je mettrais mon chapeau de Martin Fowler et ajouterais une section «quand l'utiliser».

Vos normes couvrent-elles des problèmes transversaux comme la localisation?

FWIW J'aime le contenu de ce que vous avez écrit et je suis heureux que vous avez posté ici ...

Cheers,
Berryl