using System; // .NET Blog
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...
Derniers Commentaires