Logo Spiria

FubuMVC... Fubu quoi ?

2 avril 2013.

En 2009, Microsoft a lancé leur nouveau cadre d’application ASP.NET MVC 1.0. On pouvait enfin utiliser les technologies Microsoft et appliquer de bonnes pratiques web. Malgré ça, ASP.NET MVC avait ses défauts.

Pour pallier à ses défauts, plusieurs programmeurs, respectables dans le métier, ont décidé de créer un autre cadre d’application en .Net dont le but n’était pas de rendre facile le développement pour monsieur Tout-le-Monde, mais plutôt de mettre en place les bonnes pratiques de développement. C’est ainsi qu’au début 2011 (ou fin 2010, je ne suis pas certain), naissait « For Us By Us MVC » mieux connu sous FubuMVC.

Comme tout bon projet à code source libre FubuMVC est resté bêta pendant un bon 2 ans pour arriver à une version officielle 1.0 sortie en janvier 2013. J’ai donc décidé de me lancer dans FubuMVC et faire mes premiers essais.

Les premiers pas

Pour démarrer un projet FubuMVC, c’est très simple :

  1. Créer un « Asp.Net Empty Web App Application »
  2. Via Nuget, installez FubuMVC

Voilà, c’est fait, vous pouvez compiler et lancer l’application... mais où sont les vues, les contrôleurs, et comment ça fonctionne ?... Maintenant le fun commence.

Pour commencer, démarrez l’application et allez à la page « /_fubu/routes » (cette page deviendra votre meilleur ami). C’est la liste des liens disponible pour l’application, il est possible de double cliquer sur une ligne pour avoir plus d’information.

Avec FubuMVC, il est possible de mettre les « views » et les « controllers » dans n’importe quel répertoire ou « namespace ». Mais pour l’instant nous allons s’en tenir à la convention suggérée par FubuMVC.

Ce qui était des contrôleurs dans ASP.NET MVC est maintenant des classes dont le nom se termine par « Endpoint » ou « Endpoints ».

Ce qui est suggéré par l’équipe de Fubu est de nommer les « actions » ou méthodes avec un préfixe « get_ » ou « post_ » suivi du nom de la méthode. Les caractères soulignés « _ » deviendront des barres obliques « / ». Par exemple :

  1. get_Read aura comme lien « /Read » et disponible seulement en « get »
  2. get_Read_Book aura comme lien « /Read/Book », disponible seulement en « get ».
  3. Post_Book_Update aura comme lien /Book/Update disponible seulement en « post ».

Vous pouvez vous amuser avec les noms de méthode et de classe et retourner voir « _fubu/routes ».

Hello World

Pour mon « HelloWorld », ce que j’ai fait :

  1. Créer un répertoire « Book »
  2. Créer une classe « BookViewModel » public class BookViewModel { public string Name { get; set; } }
  3. Créer une classe « BookEndpoint » avec la méthode « get_Book_Detail »
    
    public class BookEndpoint
    {
        public BookViewModel get_Book_Detail()
        {
            return new BookViewModel { Name = "Some Book Title" };
        }
    }
  4. Créer une vue « Razor » dont le modèle est « BookViewModel »
  5. Je compile, je lance l’application et je vais à l’adresse « /Book/Detail » et ça fonctionne.

Remarquer que :

  1. Je n’ai pas de classe qui hérite de « ControllerBase »
  2. Je n’ai pas placé le contrôleur dans le répertoire « Controller » et la vue dans le répertoire « Views »
  3. Je n’ai pas une méthode qui retourne un « ActionView »

La « magie » de FubuMVC est en mesure de jumeler l'objet retourné à la vue... En fait une des bonnes pratiques qu’ils appliquent c’est le « One Model In, One Model Out ». C’est-à-dire que chaque action doit avoir un objet unique comme paramètre d’entrée (ou n’avoir aucun paramètre d’entrée) et l’objet retourné doit aussi être unique (ou ne rien retourner).

Ce qui me donne une classe qui est mon contrôleur, mais qui sera beaucoup plus facile à tester que les contrôleurs de ASP.NET MVC.

Conclusion

FubuMVC manque de documentation. Du moins, elle n’est pas facile à trouver et elle n’est pas toujours à jour. Par contre lorsqu’on prend le temps de l’apprendre ça devient assez contagieux et nous voulons en savoir plus.

Il y a beaucoup à explorer et c’est ce que je vais faire pour revenir avec des exemples plus complets.