web-dev-qa-db-fra.com

MVVM, Unity, Prism, MEF, Caliburn - Que devrais-je utiliser?

S'il vous plaît, aidez-moi, je me perds!

J'écris une petite application de bureau qui a des contrôles et des écrans. Celui-ci devrait ensuite être intégré à un petit site Web, comportant également quelques écrans. L'idée est de laisser l'utilisateur éditer des vidéos et sélectionner des images, puis partager leurs résultats avec ses amis.

L'application de bureau utilise C # WPF, le site Web ASP.Net MVC.

J'ai lu que faire passer l'application au-delà de quelques écrans serait plus facile avec MVVM. J'ai donc commencé à chercher et à découvrir Caliburn.Micro et MVVM.Light. J'ai téléchargé des tutoriels mais, alors que je m'apprêtais à plonger profondément dans le matériau, j'ai trouvé ici sur S.O . qu'il y a aussi Prism, MEF, Unity, ReactiveUI - Cela devient trop!

Je suis terrible pour apprendre de nouvelles choses - cela me prend énormément de temps pour étudier WPF et ASP.Net MVC. Je ne veux pas étudier beaucoup de nouveau matériel pour découvrir plus tard que ce n'est pas pertinent. Et je n'ai pas d'architecte pour m'instruire.

Ma question est donc la suivante: Pouvez-vous mettre ces cadres et technologies en perspective et suggérer les domaines sur lesquels je devrais me concentrer pour étudier et utiliser (en particulier ce qui peut être utilisé ultérieurement avec Windows 8)?

27
Avi

Si vous voulez construire une application MVVM (ce que vous faites probablement pour divers avantages), alors vous voulez un framework MVVM .

Je recommanderais Caliburn.Micro , car il est facile à mettre en œuvre en suivant les exemples de la page de documentation de Caliburn.Micro. Il a également une convention très convaincante sur le mécanisme de configuration et utilise un système Actions pour appeler des verbes (méthodes) sur vos modèles de vue à partir de la vue. C'est plus puissant que tout autre mécanisme que j'ai vu.

Prism est un framework assez lourd qui inclut des éléments de conception MVVM pour faciliter la mise en œuvre, mais il est particulièrement adapté à la construction d'applications composites (applications constituées de composants découplés au sein d'un Shell d'hébergement).

MEF est utile pour ces types d'applications nécessitant la découverte de plug-ins ou d'extensions (même après le démarrage de l'application) et peut être utilisé avec un framework MVVM tel que Caliburn.Micro. MEF peut également être utilisé pour implémenter l'inversion de contrôle, mais ne fournit pas certaines des fonctionnalités essentielles des autres inversion de conteneurs de contrôle. Vous pouvez donc décider de l'utiliser uniquement pour implémenter la fonctionnalité de plug-in.

Unity est un conteneur IoC et serait utilisé pour implémenter l'injection de dépendance pour votre infrastructure d'applications générale. Il existe cependant de nombreux conteneurs IoC dans l'espace .NET, dont certains offrent des performances améliorées, des fonctionnalités supplémentaires ou une API plus conviviale.

Je ne sais pas à propos de ReactiveUI car je ne l'ai pas utilisé.

Si vous parlez de maximiser la réutilisation du code pour un transfert vers WinRT, alors MVVM est un excellent choix .

40
devdigital

PRISM inclut déjà la logique MEF et MVVM :)

Ok un peu d'explication ici:

MVVM signifie logique dans votre application. Une manière astucieuse de découpler View, View-Model et Model. Je ne connais pas le meilleur (?) Cadre pour le faire - vous pouvez vérifier Catel si vous voulez ou MVVM Light mais c'est juste une tonne de code de quelqu'un qui comprend le Logique MVVM et facilitent son implémentation. Vous pouvez réellement essayer d’écrire votre propre framework MVVM et constater qu’il n’ya "pas d’ingrédient secret" - le même code répétitif, les mêmes classes, etc ... En fait, vous n’avez pas besoin de n’importe quel framework MVVM pour implémenter MVVM.

Une fois que vous avez appris et écrit MVVM, vous vous êtes immédiatement posé la question suivante: comment I NUnit le teste-t-il de manière découplée (ce n’est pas un problème trivial dans Silverlight, par exemple)? Par exemple MEF. Vous pouvez suivre un exemple pour comprendre une vue d'ensemble du framework Inject:

Projet 'Partagé', écrit avec 'séparateur minimal' (par exemple, Portable Library)

    public interface IAmSharedInterface
    {
        string SayHello();
    }

Projet 'Principal', référence uniquement 'Projet partagé'

    public class IAmMainClass
    {
        [ImportingConstructor]
        public IAmMainClass(IAmSharedInterface SharedInterface)
        {
             SharedInterface.SayHello();
         }
    }

Projet 'Implementor', référence uniquement 'Shared' project

   [Export(IAmSharedInterface)]
   public class IAmImplementor: IAmSharedInterface
   {
       public string SayHello()
       {
          return "Hello from implementator class to whoever using it";
       }
    }

Vous voyez - il n'y a pas de référence directe entre les projets "Principal" et "Implémentateur" - tout "magie" se produit dans le processus de construction/résolution MEF/Unity. Ainsi, vous pouvez facilement exécuter le test NUnit sur Main sans utiliser le projet 'Implementor' et 'Implementor' avec 'Main'. Il existe également un scénario dans lequel un autre projet pourrait implémenter et exporter "IAmSharedInterface" spécialement à des fins de test.

Revenons donc à PRISM - tout y est (!). Je sais que ce n'est pas facile de comprendre tout de suite et que ne fonctionne pas convient aux programmes simples "Hello World", mais une fois que vous l’avez appris, vous ne pouvez plus revenir en arrière. Il suffit de coller toutes les parties ensemble et de vous donner une grande liberté d’utilisation du framework moq de votre choix (par exemple Rhino ).

Prism en développement sous Microsoft donc (j'espère) il sera supporté non seulement sous Windows 8 mais également sous Windows 9 et dans toutes les versions futures.

Tout ce que vous avez demandé est contenu à l'intérieur: MVVM, Inject, découplage/plug-ins, facile à lire et à tester

15
Jasper

Pour enregistrer les informations détaillées ci-dessus, je vais essayer de vous simplifier la vie.

1) Pour l’instant, oubliez l’architecture IOC/Dependency Injection/Plugin. Vous dites que vous créez une application simple, alors oubliez ceci pour le moment. Gardez votre code bien rangé et vous pourrez le mettre en œuvre plus tard si nécessaire (c'est bien).

2) Parmi les cadres que vous avez énumérés, je suggérerais Caliburn.Micro. C'est relativement simple et léger. Il ne vous faudra pas longtemps pour être opérationnel.

3) Créez votre modèle dans une assemblée distincte que vous pouvez utiliser à la fois pour votre application Windows et votre site Web MVC.

Restez simple et ne vous perdez pas avec toutes les technologies.

11
pfeds

Cette réponse reproduit quelques fragments abrégés de L'article du blog de Rockford Lhotka "L'utilisation du modèle MVVM nécessite un cadre" qui a été cité dans une autre réponse .

C'est en quelque sorte une méta-réponse à cette question (bien qu'elle contienne une recommandation spécifique), mais il a paru très utile d'expliquer le rôle d'un cadre dans MVVM en premier lieu.

Il y en a trois assez modèles de conception de couche de présentation populaires que j’appelle collectivement les modèles «M»: MVC, MVP et MVVM. C'est parce qu'ils ont tous un “M” pour “Model”, plus quelques autres constructions.

La chose avec tous ces "M" modèles est que pour typique développeurs, les modèles sont inutiles sans framework. En utilisant le des motifs sans cadre entraînent presque toujours la confusion, complication, coûts élevés, frustration et finalement désespoir.

Après tout, ce ne sont que des modèles, pas des implémentations. Et ils sont grands modèles complexes qui comprennent un certain nombre de concepts qui doivent fonctionner correctement ensemble pour permettre le succès.

...

Essayer de faire quelque chose comme MVVM sans framework est une énorme somme de travail. Des tonnes de code en double, réinventer la roue et recycler les gens à penser différemment.

Au moins, avec un framework, vous évitez le code dupliqué et espérons-le pas besoin de réinventer la roue - vous permettant de vous concentrer sur le recyclage personnes. La partie de recyclage est généralement inévitable, mais un cadre fournit le code et la structure de plomberie, ce qui facilite le processus.

Vous vous demandez peut-être pourquoi le modèle MVC n'est devenu populaire que dans ASP.NET il y a quelques années ...

Étrangement, MVC n’a commencé à se généraliser que dans Microsoft monde quand ASP.NET MVC est apparu. Ceci est un cadre complet avec outillage intégré à Visual Studio. Par conséquent. typique les développeurs peuvent simplement construire des modèles, des vues et des contrôleurs. Antérieur à à ce moment-là, ils devaient également construire tout ce que le framework MVC - –__. ce qui fait beaucoup de code. Et pas seulement beaucoup de code, mais un code qui a absolument rien à voir avec la valeur commerciale, et ne concerne que mise en œuvre du motif lui-même.

...

Les développeurs typiques veulent vraiment se concentrer sur la construction de modèles, de vues, et viewmodels. Ils ne veulent pas avoir à construire une base de référence faible routeurs d’événements, modèles de navigation, abstractions de vues, et tous les autres les choses qu'un cadre doit faire.

...

Pendant ce temps, Caliburn Micro semble être le meilleur framework MVVM là-bas - certainement le plus largement utilisé [à partir de 2012] ...

(Texte copié en ligne pour des raisons de conservation.)

0
DaveInCaz