2010-01-09 10 views
2

J'ai essayé d'utiliser le modèle de fournisseur configurable pour gérer mes importations et les exportations de MEF MEF Contrib (link). J'ai lu la documentation de Codeplex et l'article de blog de Code Junkie (link); Cependant, je n'arrive pas à obtenir le conteneur pour créer les pièces. Où vais-je mal?Contrib Modèle MEF fournisseur non importé des pièces

Program.cs

namespace MEFTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      p.Run(); 
     } 

     // [ImportMany("command", typeof(IHelp))] 
     public IEnumerable<IHelp> Commands { get; set; } 

     void Run() 
     { 
      Compose(); 

      foreach(IHelp cmd in Commands) 
      { 
       Console.WriteLine(cmd.HelpText); 
      } 

      Console.ReadKey(); 
     } 

     void Compose() 
     { 
      var provider = new ConfigurableDefinitionProvider("mef.configuration"); 
      var catalog = new DefinitionProviderPartCatalog<ConfigurableDefinitionProvider>(provider); 
      var container = new CompositionContainer(catalog); 
      container.ComposeParts(this); 
     } 
} 
} 

TestCommand.cs

namespace MEFTest 
{ 
    //[Export("command", typeof(IHelp))] 
    public class TestCommand : IHelp 
    { 
     private string _helpText = "This is a test."; 

     public string CommandName 
     { 
      get { return "Test"; } 
     } 

     public string HelpText 
     { 
      get { return _helpText; } 
     } 
    } 
} 

section App.Config:

<mef.configuration> 
<parts> 
    <part type="MEFTest.TestCommand, MEFTest"> 
    <exports> 
    <export contract="IHelp" /> 
    </exports> 
    </part> 
    <part type="MEFTest.Program, MEFTest"> 
    <imports> 
    <import member="Commands" contract="IHelp" /> 
    </imports> 
    </part> 
</parts> 
</mef.configuration> 

Je ne reçois pas d'erreurs de construction et il fonctionne très bien si je passer au système basé sur les attributs typique qui fait partie du noyau MEF (avec le catalogue approprié aussi). Program.Commands est toujours NULL dans l'exemple ci-dessus. J'ai essayé d'utiliser une propriété singulière au lieu d'une collection et d'obtenir les mêmes résultats.

Quand je debug je peux obtenir la collection provider.Parts donc je sais qu'il accède correctement aux informations de configuration; cependant, j'obtiens une exception InvalidOperationException chaque fois que je débogue et j'essaie de forer dans catalog.Parts.

Quelqu'un at-il une expérience de l'endroit où je me trompe ici?

Répondre

0

Comme indiqué here, vous devez également dans votre fichier de configuration:

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

Si vous avez déjà, alors il pourrait être intéressant de nous montrer la trace de la pile de la InvalidOperationException que vous obtenez lorsque vous accédez à provider.Parts .

0

J'ai eu les mêmes problèmes et je n'ai pas réussi à l'obtenir, mais voici quelques détails: Il semble que ComposeParts() ne fonctionne pas comme prévu (au moins dans la version que j'ai utilisée) car il utilise des méthodes statiques, basé sur Réflexion pour trouver toutes les importations requises (il semble donc que cette partie ne puisse pas être changée de l'extérieur du MEF). Malheureusement, nous voulons utiliser la configuration XML et non les attributs MEF.

Il fonctionne si vous ajoutez [Import] attribue aux membres de la classe vous que vous utilisez avec ComposeParts(). Dans votre cas, ce serait "Programm". Dans ce cas, toutes les exportations définies dans le fichier de configuration seront trouvées.

je ne pouvais pas trouver de la documentation ou des exemples sur la page relative à Contrib MEF ce problème. Il n'y a pas non plus d'unittest dans le projet contrib MEF qui utilise ComposeParts(). Une solution de contournement consisterait à utiliser container.GetExportedValues ​​() pour récupérer les valeurs, mais dans ce cas, vous devez définir les membres des classes manuellement.

Espérons que ça aide.