Julien on jan 27th 2009
Je ne commente que très rarement les annonces faites ici et la sur Net... Pourtant, j'ai envie de faire une exception avec celle qui vient d'être publiée un peu plus tôt aujourd'hui par Scott Guthrie et Phil Haack : l'annonce de la RC d'Asp.net MVC.
Asp.net MVC est un produit à part chez Microsoft, c'est une ALTernative à une technologie bien connue sous la plateforme .Net : les Webforms. C'est surtout l'un des tout premiers efforts de Microsoft pour adhérer à une certaine façon de développer des logiciels. Entendez par là agilité, tests, DRY ou encore SOLID.
C'est aussi un autre regard sur la communauté : jamais auparavant un framework n'aura tant bénéficier des retours des utilisateurs. Pour s'en convaincre il suffit de voir les points d'extensions qui ont été ajoutés, les signatures qui ont été refactorisées pour éliminer les dépendances vers les briques non testables, ou encore les nouveaux helpers dans MVC Futures qui sont dérivés de projets open source comme MVC Contrib.
Mais enfin de compte, cette release candidate est avant toute chose une victoire. Une victoire pour tout ceux qui militent pour développer des logiciels autrement. Aujourd'hui tout ces gens ne sont plus marginaux sur la plateforme .Net, ils ont désormais le soutient de Microsoft!
Alors ce framework n'est pas parfait. Des ALTernatives très puissantes existent d'ailleurs sous d'autres plateformes (Ruby On Rails pour n'en citer qu'une). Sous .Net, nous avons depuis longtemps Monorail, qui est peut être d'ailleurs plus mature ou plus puissant, je n'ai pas d'avis sur la question. Le fait est que c'est un tel changement de paradigme au sein de cette communauté que l'on ne peut que se réjouir de cette annonce!
Longue vie à Asp.net MVC !
Filed in Asp.net MVC | No responses yet
Julien on nov 18th 2008
Grâce à MVC Contrib, un librairie open source couvrant certains aspects absents d'Asp.net MVC, il est possible d'utiliser des "SubControllers" afin de réutiliser des unités logiques au sein de plusieurs actions en minimisant la duplication de code. Matt Hinze, à l'origine du projet en explique le fonctionnement ici.
Pour récupérer les instances des sous contrôleurs, Matt utilise l'injection de paramètre au niveau des actions. Cette méthode à le mérite d'être simple et efficace mais je trouve qu'elle nuit aussi à la lisibilité du code, dans la mesure ou ce paramètre n'est pas réutilisé dans le corps de l'action. J'ai donc légèrement modifié la syntaxe en introduisant un attribut :
[SubController
(typeof(ProductSearchSubController
), SubControllerKeys.
ProductSearch)] public ActionResult Index()
{
return View();
}
L'attribut prends 2 paramètres, le type du sous contrôleur à instancier et une chaine de caractère qui définit la clef du dictionnaire ViewData dans lequel on stockera l'instance à invoquer. J'utilise ici une constance, SubControllerKeys.ProductSearch mais on pourrait tout à fait la remplacer par "ProductSearch". L'invocation coté vue ressemblera alors à cela :
<% Html.ViewData.Get("ProductSearch").Invoke(); %>
Voici le code pour cet attribut :
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class SubControllerAttribute : ActionFilterAttribute
{
private Type _subControllerType;
private string _viewDataKey;
public Type SubControllerType
{
get
{
return _subControllerType;
}
set
{
Guard.AgainstNull(value, "value can't be null");
Require.
That(typeof(ISubController
).
IsAssignableFrom(value
),
String.
Format("The type '{0}' does not inherit from ISubController.", value.
FullName));
_subControllerType = value;
}
}
public string ViewDataKey
{
get { return _viewDataKey; }
set { _viewDataKey = value; }
}
public SubControllerAttribute(Type subControllerType, string viewDataKey)
{
_subControllerType = subControllerType;
_viewDataKey = viewDataKey;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Guard.AgainstNullOrEmpty(_viewDataKey, "View data key is not set");
Guard.AgainstNull(_subControllerType, "Sub controller type is not set");
ISubController subController = (ISubController)ObjectFactory.GetInstance(_subControllerType);
if (subController == null) {
throw new InvalidOperationException
(_subControllerType +
" is not registered with StructureMap");
}
filterContext.Controller.ViewData.Add(_viewDataKey, subController.GetResult(filterContext.Controller));
base.OnActionExecuting(filterContext);
}
}
Deux remarques (qui expliquent pourquoi je n'ai pas soumis de patch pour MVC Contrib) :
- J'utilise structure map pour construire mon instance du sous contrôleur (ligne 39). Idéalement il faudrait utilise une interface pour pouvoir plugger tout les outils d'injection de dépendances)
- J'utilise une mini libraire maison pour tester les pré-conditions (Guard.* et Require.*). Il faudra donc la remplacer par des if ou une librairie équivalente.
P.S : Je viens de me rendre compte que je ne pouvais pas coller du code contenant des commentaires en xml. Quelqu'un peut me conseiller un plugin wordpress qui gère cela?
Filed in Asp.net MVC | 3 responses so far