.NET, Architecture, ALM, Cloud

Publicité

Unity Application Block et les types génériques

Avant d'aller plus loin, pour ceux qui ne connaisent pas Unity Application Block, je vous renvoit vers mon post de Présentation d'Unity Application Block.

J'ai été confronté aujourd'hui à une problématique qui était de gérer un service générique. Nous utiliserons dans ce post pour exemple l'interface du service  IServiceGenerique
<T, U> avec son implémentation MonServiceGenerique
<T, U>.
Nous utilisions alors toujours la version 1.0 d'Unity Application Block (grosse erreur !) et en faisant le code suivant pour récupérer nos services (en mode singleton via le "ContainerControlledLifetimeManager") :

container.Resolve<IServiceGenerique<ClassA, ClassB
>>();
container.Resolve<IServiceGenerique<ClassA, ClassA>>();

Unity nous récupérait alors bien le premier service IServiceGenerique<ClassA, ClassB> mais lors du deuxième Resolve, unity nous renvoyait toujours le IServiceGenerique<ClassA, ClassB> au lieu du IServiceGenerique<ClassA, ClassA> !

En faisant ensuite une recherche sur internet, c'était effectivement un bug d'unity v 1.0 qui a été corrigé avec unity 1.1. Si vous utilisez Unity, je vous conseille donc vivement de mettre à jour vos dépendances en récupérant
Unity V 1.1.

Avec Unity 1.1, le code suivant  (toujours en mode singleton) :

container.Resolve<IServiceGenerique<ClassA, ClassB>>();
container.Resolve<IServiceGenerique<ClassA, ClassA
>>();
container.Resolve<IServiceGenerique<ClassA, ClassA
>>();
container.Resolve<IServiceGenerique<ClassB, ClassA
>>();

nous retournera 3 instances de type IServiceGenerique<ClassA, ClassB>, IServiceGenerique<ClassA, ClassA> et IServiceGenerique<ClassB, ClassA>.

Pour information pour configurer l'enregistrement de votre type générique, voici la config unity :

<type type="UAB.Demo.Interfaces.IServiceGenerique`2, UAB.Demo.Interfaces" mapTo="UAB.Demo.Services.MonServiceGenerique`2, UAB.Demo.Services">
<
lifetime type="singleton" />
</
type>

Pour une classe générique avec un seul type et non deux, remplacez le '2 par '1 etc...

 

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