Question

J'ai essayé d'utiliser le configurable modèle de fournisseur pour la manutention de mes MEF les importations et les exportations de la MEF Contrib (lien).J'ai lu le Codeplex documentation et le Code Junkie blog (lien);cependant, je n'arrive pas à obtenir le conteneur pour créer les pièces.Où vais-je tort?

Programme.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; }
        }
    }
}

App.Section 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 n'ai pas une accumulation d'erreurs et il fonctionne très bien si je passe à l'attribut typique de ce système qui fait partie de la MEF de base (avec le catalogue de trop).Programme.Commandes est toujours la valeur NULL dans l'exemple ci-dessus.J'ai essayé d'utiliser une singulière propriété à la place d'une collecte et d'obtenir les mêmes résultats.

Quand je debug je peux obtenir de son fournisseur.Pièces de collection, donc je sais que c'est l'accès à la configuration de l'information correctement;cependant, j'obtiens une exception InvalidOperationException chaque fois que je debug et tenter de percer dans le catalogue.Pièces.

Quelqu'un a une expérience à l'endroit où je vais mal ici?

Était-ce utile?

La solution

, 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.

Autres conseils

J'ai eu les mêmes problèmes et ne pouvait pas le faire fonctionner, mais voici quelques détails:Il semble que ComposeParts() ne fonctionne pas comme prévu (au moins dans la version que j'ai utilisé) car il utilise des méthodes statiques, basée sur la Réflexion pour trouver tous les requis des Importations (de sorte qu'il semble que cette partie ne peut pas être modifié à partir de l'extérieur de la MEF).Malheureusement, nous voulons utiliser des fichiers xml de configuration et de ne pas le MEF attributs.

Cela fonctionne si vous ajoutez [Importer] attributs pour les membres de la classe que vous que vous utilisez avec ComposeParts().Dans votre cas, ce serait "Programm".Dans ce cas, tous les exportations défini dans le fichier de configuration sera trouvé.

Je ne pouvais pas trouver de la documentation ou des exemples sur la MEF Contrib page relative à ce problème.Aussi il n'y a pas de unittest par la MEF contrib projekt qui utilise ComposeParts().Une solution serait d'utiliser un conteneur.GetExportedValues() pour récupérer les valeurs, mais dans ce cas, vous devez définir les classes membres manuellement.

Espérons que cela aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top