Actualités

[21/07/2017] Smile lance les premiers vélos solaires connectés à l’occasion du Sun Trip Tour 2017

Smile, leader des solutions IoT et open source, confirme sa solide expertise sur le marché de l’embarqué en participant activement à la course de vélos solaires du Sun Trip Tour.

[03/07/2017] Smile remporte le Drupagora d'Or 2017 du meilleur site e-commerce

Le vendredi 30 juin, la 3ème édition des Drupagora d'Or s'est déroulée à Paris.

[30/06/2017] Découvrez les projets de nos équipes au Hackathon Data Énergie

Les 29 et 30 juin, le Hackathon Data Énergie s'est déroulé au Liberté Living Lab à Paris.

Toutes les actualités picto
       

Vous avez besoin de mettre à jour votre Lecteur Flash Flash 7

Guillemet ouvrant l'actualité des solutions
et des technologies open source Guillemet fermant
picto

Unity 2.0

L'injection de dépendance s'invite dans Microsoft Enterprise Library 5.0 qui intègre désormais le conteneur léger Unity dans sa version 2.0. Ce conteneur léger supporte l'injection de dépendances par type ou par nom en utilisant le constructeur, les propriétés ou une méthode d'initialisation.

Configuration de Unity

Configuration par fichier

Unity se configure par du XML qui peut se trouver soit directement dans un des fichiers XML de configuration habituels (App.config ou Web.config) soit dans un fichier séparé dédié. Une section XML Unity peut se résumer à la déclaration de namespaces et/ou d'assembly à scanner à la recherche d'attributs d'injection. Elle peut également contenir des déclarations explicites d'injection :

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <namespace name="MyApp.Implementations" />
    <assembly name="MyApp" />
 
    <container>
       <register type="IUserDAO" mapTo="DbUserDAO" name="UserDAO" />
        <register type="ILogger" mapTo="NetworkLogger" /> 
       <register type="ILogger" mapTo="NullLogger" name="noLogger" />
    </container>
 
</unity>

Dans le cas où la section XML de Unity se trouve dans un fichier XML standard, le chargement du conteneur léger se fait par une simple instanciation suivit de l'appel à la méthode LoadConfiguration(). Cette méthode accepte également un paramètre de type UnityConfigurationSection dans le cas où la configuration se situe dans un fichier externe :

IUnityContainer container = <font color="#0000ff">new</font> UnityContainer().LoadConfiguration();

Configuration par API

Unity peut également être configuré par API. Toutefois, cette méthode fait perdre un peu d'intérêt à l'injection de dépendance. Il faudrait en effet recompiler le code pour changer les injections.

IUnityContainer uContainer = new UnityContainer()
   .RegisterType<IUserDAO, DbUserDAO>("UserDAO")
   .RegisterType<ILogger, NetworkLogger>()
   .RegisterType<ILogger, NullLogger>("noLogger");
IUserDAO userDao = uContainer.Resolve<IUserDAO>();

Attributs d'injection

Les dépendances peuvent être déclarées par des attributs positionnés sur les membres d'une classe. Par défaut, il n'est pas utile de préciser le nom du type concret à injecter, la résolution de la dépendance se faisant sur le type de la propriété. Spécifier un nom explicitement peut néanmoins servir à forcer l'injection d'un type concret particulier, différent du type par défaut.

public class MyClass
{
    private ILogger logger; 
 
    private IUserDAO userDAO;
 
    [Dependency("UserDAO")]
    public IUserDAO UserDAO
    {
        get { return logger; }
        set { logger = value; }
    }
 
    [Dependency]
    public ILogger Logger
    {
        get { return logger; }
        set { logger = value; }
     }
}

Autre fonctionnalités notables

Unity permet une gestion du cycle de vie des objets en proposant plusieurs managers. Notamment le ContainerControlledLifetimeManager qui permet d'obtenir un singleton :

<container>
 
    <register type="IUserDAO" mapTo="DbUserDAO"  name="UserDAO">
 
        <lifetime type="singleton" />
 
    </register>
 
</container> 

L'injection par constructeur est possible ainsi que la déclaration d'instances directement dans la fichier de configuration. Cela peut se révéler utile notamment en permettant de regrouper tous les variables de configuration de l'application :

<container>
 
    <register type="ILogger" mapTo="FileLogger">
 
        <constructor>
 
            <param name="filePath" value="LogFilePath" />
 
        </constructor>
 
    </register>
 
    <instances>        
 
        <add  name="LogFilePath" type="System.String" value="d:\logs\log.txt" />
 
        <add  name="DatabaseHost" type="System.String" value="10.1.2.42" />
 
    </instances>
</container>

Conclusion

Unity est un conteneur léger complet et simple de prise en main. Sa configuration est intuitive et son API très bien pensée. Il permet de démocratiser un peu plus l'injection de dépendance dans le monde .NET et complète efficacement Microsoft Enterprise Library 5.0.

Philippe De Oliveira
picto

Commentaires

Soyez la premiere personne à ajouter un commentaire sur cet article.
Ecrire un nouveau commentaire