Séparation des couches en ASP.NET avec Unity ;-)

En continuant sur le développement des bibliothèques Lelibre.*, j'ai privilégié l'utilisation de Unity // à ce qui est disponible sur le marché de l'opensource. Ce post n'indique pas ce qu'il faut faire absolument ou ne pas faire. Mais il donne ma vision de découpe ... En effet, voici un mécanisme simple pour avoir un "controleur" regroupant toutes les actions business que l'on pourrait appeler depuis les pages ASPX...
  1. Configuration de Unity via le fichier de configuration
  2. Il faut commencer par rajouter une section dans le fichier de configuration et le décrire ...
      <section name="unity"
        type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
              Microsoft.Practices.Unity.Configuration" />
    
      <unity>
        <typeAliases>
          <typeAlias alias="singleton"
                     type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, 
                      Microsoft.Practices.Unity" />
        </typeAliases>
        <containers>
          <container>
            <types>
              <type type="Controllers.ExempleController, Controllers">
                <lifetime type="singleton" />
              </type>
            </types>
          </container>
        </containers>
      </unity>
    
  3. Création du singleton pour l'utilisation de Unity
  4. public static class ContainerUnity
    {
        public static IUnityContainer Container
        {
            get
            {
                if (null == container)
                {
                    lock (locker)
                    {
                        if (null == container)
                        {
                            container = new UnityContainer();
                            UnityConfigurationSection section
                                = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
                            section.Containers.Default.Configure(container);
                        }
                    }
                }
    
                return container;
            }
        }
    
        private static IUnityContainer container;
        private static object locker = new object();
    }
    
  5. Développement de la classe parent des pages ASPX
  6. public class CustomPage<T> : System.Web.UI.Page
    {
        protected T Controller
        {
            get
            {
                return ContainerUnity.Container.Resolve<T>();
            }
        }
    }
    
  7. Exemple de page ASPX
    • Classe controlleur
    • public class ExempleController
      {
          public string Key
          {
              get { return "Salut"; }
          }
      }
      
    • Page ASPX
    • public partial class _Default : CustomPage<ExempleController>
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              Label1.Text = this.Controller.Key;
          }
      }
      
    • Voici le résultat ;-)
  8. Conclusion
  9. Je suis très loin de montrer toutes les possibilités de Unity... Mais je tenterai de vous le faire découvrir prochainement ...

Commentaires

1. Le vendredi, avril 11 2008, 12:29 par Stiiifff

Salut Titi,

Pardonne-moi d'avance ... mais il me semble que tu mélanges beaucoup de choses dans ce post ... et aucune n'est vraiment claire ni correcte.

1. De quelle séparation de couches ou découpe parles-tu ? Il n'y a que 3 classes dans ton exemple.
2. Peux-me dire ce qu'Unity t'apporte dans ce cas précis ? Je ne vois qu'une Factory te permettant de créer tes classe Controller. Pas besoin d'Unity pour cela.
3. Es-tu certain que ce la responsabilité des 'actions business' doivent être donnée à un Controller ?
4. As-tu remarqué le couplage fort en ta classe de base CustomPage et la classe du container Unity ? Est-ce voulu?
5. Si ta page fait plusieurs fois appel au Controller, le container va-t-il à chaque fois créer une nouvelle instance ?
6. La configuration XML des controllers est une véritable horreur. T'imagines-tu taper 3 lignes de XML pour enregistrer chaque classe de Controller dans le container ?

2. Le samedi, avril 12 2008, 10:12 par Thierry Thoua

Bon ok mon exemple est peut-être nul :-p. Parce que en effet, le terme controleur n'a pas de sens ici. Et oui ... il manque beaucoup de concepts et d'exemples d'implémentation(interfaces, ...). Mais je voulais montrer l'interêt de Unity en quelques lignes (à première vue j'ai complètement échoué ^^). Donc j'accepte les remarques justifiées !!! En réponse à tes questions, critiques, ... ;-)

  1. => il n'y en a pas dans mon exemple ;-)
  2. => dans ce cas ... pas grand chose, ... voir même rien :)
  3. => Erreur de nommage. Entièrement d'accord
  4. => Oui "voulu". Je n'ai pas réfléchi plus loin sur ce point
  5. => singleton. Donc non
  6. => On se limite à une ligne de XML pour chaque ajout de mapping etc etc.
Je tenterai d'être plus clair sur Unity dans les prochains posts. Mais je suis évidement super interessé de ton scope d'utilisation d'un objet comme Unity pour faire de l'injection de dépendances.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet

Page top