MEF étant toujours en développement, il y a déjà de nouveaux projets qui se créent autour...

Le dernier en date annoncé par Krzysztof Cwalina le 03 mars dernier est le Provider Model. De quoi s'agit-il ?

Comme je l'ai écrit dans mon dernier post, l'élément de base dans le framework MEF est ComposablePart que nous pouvons appeler la "composante". Par défaut cet élément est implémenté en tant qu'une simple classe .NET annotée par les attributs MEF ImportAttribute ou ExportAttribute. C'est une manière déclarative de marquer les classes que nous voulons "Exporter" ou "Importer".

Cependant dans certains cas il peut s'avérer très utile de pouvoir implémenter une "composante" à travers un méchanisme différent comme par exmple les fichiers XML ou dynamiquement lors de l'exécution. C'est ce que permet de réaliser The Provider Model. En fait, c'est une bibliothèque qui permet de créer vos propres modèles de programmation pour MEF.

Definitions Provider

Définitions Provider est un concept introduit avec ce projet de Provider Model. Dans le framework actuel de MEF (Preview 4) le développeur ne peut déclarer ses Imorts/Export que d'une manière déclarative par le biais des attributs. Definions Provider ajoute de la souplesse et permet aux développeurs de déclarer leur définitions d'une nouvelle manière:

  • Attributed (Attributed Definition Provider)
  • Configurable (Configurable Definition Provider)
  • Fluent (Fluent Definition Provider)

Attributed

Ce modèle est similaire à celui qui existe actuellement dans le standard du MEF framework. Il a été créé par le souci de comptabilité avec le Provider Model.

Le modèle est basé sur deux attributs qui sont Importable et Exportable qui correspondent aux Import et Expoort du modèle standard.

Voici un exemple qui illustre la définition de l'Import ou de l'Export:

Public class Host
{
[Importable(typeof(IMessageService))]
public Export<IMessageService> Service { get; set; }
}
[Exportable(typeof(IMessageService))]
public class NullMessageService : IMessageService
{
}

Configurable

Ce modèle permet d'utiliser la syntaxe déclarative par le biais des fichiers de configuration pour marquer vos éléments pour Exporter ou Importer. Ce modèle n'est pas définitif et il risque de changer dans le future.

Tout d'abord vous devez inclure dans votre fichier de configuration une section qui permettra d'utiliser la syntaxe déclarative:

<configSections>
<section
name="mef.configuration"
type="MefContrib.Models.Provider.Definitions.Configurable.PartCatalogConfigurationSection, MefContrib.Models.Provider" />
</configSections>

Ensuite vous pouvez ajouter vos éléments "parts" pour l'import ou l'export

<mef.configuration>
  <parts>
        
<part type="assembly-qualified-name">
                <export member=”” contract=””>
                   <metadata>
                     <add name=”” value=””>
                  </metadata>
               </export>
        </part>

         <part type="assembly-qualified-name">
                <import member=”” contract=”” allowDefault=”true|false” isPrerequisite=”true|false” isRecomposable=”true|false”>
                   <metadata>
                     <add name=”” value=””>
                  </metadata>
               </export>
       
</part>

  </parts>
</mef.configuration>

Fluent

Ce modèle permet de définir les parts à importer ou exporter à partir du code. Dans l'exemple suivant la classe ServiceHost contient une propriété "Service" qui doit être importée et la méthode "MessageService" qui doit exportée:

public class ServiceHost
{
public Export<IMessageService> Service { get; set; }
}
public class MessageService : IMessageService
{
public void Execute()
{
}
}

Après avoir défini une instance du provider:

var provider = new FluentDefinitionProvider();

Nous pouvons instancier l'import du membre qui nous intéresse:

provider
.Import<ServiceHost>(s => s.Service)
.WithContract("NameOfContract");

ainsi que l'export:

provider
.Export<MessageService >(m => m)
.WithContract("NameOfContract");

Plus d'informations vous trouverez sur le site officiel: http://mefcontrib.codeplex.com/Wiki/View.aspx?title=Provider%20Model

A bientôt pour la suite :)