.NET, Architecture, ALM, Cloud

Publicité

Présentation de l'Unity Application Block

L' Unity Application Block (ex DIAB : Dependency Injection Application Block) est une brique des Applications Blocks de Microsoft dans sa version 4 qui peut d'ailleurs être utilisé en dehors en sandalone d'EntLib.

Unity va vous permettre de gérer vos objets et services en gérant leurs dépendances par injection avec possiblité d'injection sur les constructeurs, propriétés et méthodes de vos types gérés dans Unity. C'est pour résumer en une phrase le container IoC proposé par Microsoft face Spring.Net ou encore Castle..

Pour vous présenter Unity, je vous propose une solution démo (compatible VS 2005), démo accessible ici :
Démo Unity Application Block.

Dans cette démonstration, vous trouverez une application console qui consomme deux services : un service de log et un service de trade (avec leur interface et leur implémentation). Dans le fichier de configuration, vous trouverez  la configuration unity permettant de spécifier le mapping entre les types à charger (interface) et leur  implémentation. Le service de trade a une dépendance sur le service de log ce qui vous permettra de voir comment est géré l'injection de dépendances.

Dans la démonstration, l'injection de dépendances se fait par attribut et nous verrons en fin du post comment casser ce lien, lien qui peut être assez gênant qui consiste en effet de coupler fortement les services avec l'Unity Application Block.

Comme vous pourrez le voir en consultant la démonstration, le principe d'enregistrement d'un type est assez simple :

<unity>
  <
typeAliases
>
     
     <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity"
/>
  </typeAliases>
  <containers
>
     <
container name="myContainer"
>
       <
types
>
          <type name="TradeSingleton" type="UAB.Demo.Interfaces.ITradeService, UAB.Demo.Interfaces" mapTo="UAB.Demo.MyTradeGateway.MyTradeGatewayService, UAB.Demo.MyTradeGateway"
>
         <
lifetime type="singleton"
/>
         </
type
>
     </types
>
    </
container
>
  </
containers
>
</
unity
>


Pour la durée de vie de notre service, nous avons utilisé un LifetimeManager founit de base par Unity permettant de gérer notre service sous la forme d'un singleton. Nous avons ensuite enregistré notre service de trade définit par l'interface "ITradeService" en chargeant l'implémentation "MyTradeGatewayService". 

L'injection de dépendance sur vos services est gérée via l'attribut Dependency comme suit :

[Dependency]
public ILoggerService
Logger
{
 get { return
_logger; }
 set { _logger = value
; }
}


Enfin, pour pouvoir utiliser le service ITradeService, il vous suffit d'ensuite d'accéder à votre container comme suit : 

public static class ServiceContainer
{
   private static IUnityContainer _container = null
;
   public static IUnityContainer
Container
   {
     get
     {
        if (_container == null
)
        {
          _container =
new UnityContainer
();
          UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"
);
          section.Containers[
"myContainer"
].Configure(_container);
        }
        return
_container;
    }
  }
}

Puis il vous suffit de faire appel à la méthode Resolve pour récupérer votre service en spécifiant le type du service à charger :

ITradeService tradeServiceSingleton = ServiceContainer .Container.Resolve<ITradeService>();

Vous pouvez enregistrer plusieurs fois le même type dans le même container par contre il vous faudra pour cela donner un nom pour pouvoir ensuite récupérer l'implémentation souhaité en spécifiant le nom configuré en paramètre de la méthode "Resolve".

Enfin pour casser le lien entre le service et Unity et ne pas avoir les attributs Unity pour gérer les injections, vous pouvez spéicifer dans la configuration d'Unity les propriétés d'injections de dépendance.

 

Publicité
Retour à l'accueil
Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article