8

Lorsque Jeremy & Tchad posted about their FubuMvc project, l'un des différenciateurs ils ont mentionné était leur « Thunderdome principal »:Thunderdome MVC- Pourquoi un modèle unique en MVC?

Le « Thunderdome Principe » - Tous les méthodes contrôleur prennent dans un objet ViewModel (ou zéro objets certains cas) et retourner un seul objet ViewModel (un objet entre, un objet quitte). Les classes Controller ne seront JAMAIS directement exposées à tout ce qui est lié à HttpContext. Rien ne me fait pleurer comme voir les gens qui essaient d'écrire des tests qui se moquent ou stub cette nouvelle interface IHttpContextWrapper . De même, les méthodes du contrôleur ne renvoient pas d'objets ViewResult et sont généralement découplées de de toute l'infrastructure MVC. Nous adopté cette stratégie très tôt comme une façon de rendre le contrôleur de test plus simple mécaniquement. C'est certainement atteint cet objectif, mais il est également fait le code du contrôleur très simplifié et facile à lire. Nous allons expliquer comment cela fonctionne à KaizenConf.

Quel est l'avantage de leur 'un ViewModel (ou zéro) dans' approche?

Répondre

9

Son principal avantage est que c'est une convention et rend les choses cohérentes dans tous nos contrôleurs. Il nous est plus facile de configurer des «contextes»/appareils de test capables d'initialiser l'environnement dans un scénario de test d'intégration. Dans la plupart des cas, Conventions == Rapidité car il supprime beaucoup de scénarios «et si» de vos considérations de conception.

Puisque toutes nos actions de contrôleurs suivent le même modèle, nous pouvons supposer beaucoup de choses et cela accélère et rationalise nos efforts de test intégrés de contrôleur. Il n'y a rien de mal, nécessairement, à avoir plusieurs arguments pour une action de contrôleur, mais nous avons trouvé que l'existence d'un objet modèle nous offre des fonctionnalités supplémentaires car le modèle peut contenir une logique simple et exposer des propriétés de commodité qui peuvent simplement aspects plus complexes de son propre état, etc - en gros, c'est l'argument pour avoir n'importe quel modèle riche et n'est pas unique au modèle Thunderdome/OMIOMO.

+0

D'accord, je peux certainement acheter les avantages d'être juste une convention. Je vais donner à ce modèle une chance sur l'un de mes prochains projets. – Troy

+0

Avoir 16 paramètres pour tous les contrôleurs est aussi une convention. La Convention en soi n'est pas nécessairement une bonne chose. – liammclennan

+0

@liamclennan C'est correct. Des conventions intelligentes pourraient être une meilleure façon de le décrire. Heureusement, personne ne préconisait des conventions stupides, mais merci de le signaler :) – chadmyers

0

L'avantage est que vous ne comptez pas sur un type de contexte (comme un état de session, par exemple) de l'extérieur des méthodes du contrôleur. Cela rend plus facile de les tester, car vous n'avez pas à "simuler" ce contexte en utilisant des simulacres, mais cela le rend également moins pratique car vous devez tout passer par des paramètres.

+0

Je comprends bien que devoir mocker des contextes et autres quand tester votre contrôleur est une douleur - mais je pense que ce genre de douleur peut être soulagé en utilisant DI. Je ne vois toujours pas comment chaque action prend un seul paramètre aide. Vous ne déchargez pas les mêmes problèmes de test sur le modèle? – Troy

+0

Je ne considère pas qu'un 'ViewModel (ou zéro) dans' signifie que vous ne pouvez avoir qu'un seul paramètre. Je pense que vous pouvez en avoir deux ou même plus. Mon interprétation est que la méthode Action ne prend rien en dehors de la classe Controller, comme le contexte Http. C'est comme ça que je l'ai lu. –

+0

@Dave: Non, l'intention avec Thunderdome/OMIOMO est d'avoir un ou des arguments d'entrée zéro à la méthode où l'un argument est un modèle riche (au lieu d'une primitive) qui représente la requête d'action richement – chadmyers

0

L'avantage du principe du tonnerre est qu'il simplifie les contrôleurs. Comme le mappage des valeurs http aux objets se fait en dehors des contrôleurs, cela signifie que les contrôleurs ne font que ce qu'ils doivent faire.

+0

Les modélisateurs mappent les valeurs http aux paramètres d'action en dehors du contrôleur, non? – Troy

+0

Je ne pense vraiment pas que cela simplifie votre conception. Cela simplifie probablement les contrôleurs, mais vous devrez le traiter quelque part. –

+0

Troy a raison de dire que Modelbinders fera le levage pour vous, mais il ne peut pas nécessairement gérer certaines situations où la logique pourrait être nécessaire. Cela incombe généralement au contrôleur. Avec Thunderdome/OMIOMO c'est dans le modèle d'entrée – chadmyers