lundi 16 avril 2012

MEF, importer le constructeur

Bien le bonjour,
Bien que j'ai déjà fait un article sur le MEF, je voudrais apporter une explication sur une fonctionnalité fort intéressante à mon gout: "importingconstructor". Le but de cette option est de partager un objet du conteneur avec l'ensemble de ses plugins. Dans mon projet actuel, il me permet de donner accès à des fonctionnalités de la Kinect à chaque composant chargé par MEF.

Dans le conteneur, lors de l'instanciation du MEF:
string[] directories = Directory.GetDirectories("Plugins");
AggregateCatalog containerMaster = new AggregateCatalog();
foreach (string directory in directories)
{
      containerMaster.Catalogs.Add(new DirectoryCatalog(directory));
}
CompositionContainer container = new CompositionContainer(containerMaster);
container.ComposeExportedValue("myKinect", _myKinect);
container.ComposeParts(this);
On remarque que l'importingconstructor ne nécessite qu'une seule ligne (l'avant dernière ligne), que celle-ci ne comporte que la variable _myKinect et le nom sous lequel on référence cette variable: "myKinect".

Une fois dans un composant, il faut récupérer cette variable. Cela se fait dans le constructeur comme suit:

[ImportingConstructor]
        public MainWindow([Import("myKinect")] KinectSensor myKinect)
        {
            _kinect = myKinect;
        }
 J'espère que cette explication vous sera utile. Je fini néanmoins par vous prévenir sur le fait que cette technique peut posséder un risque, vu que vous donner accès à des ressources sans connaître le composant qui va les exploiter.

Comme on dit chez moi: Paix sur ta couche!