Frage

Ich habe versucht, die Verwendung der konfigurierbaren Anbieter Modell für die Handhabung von meinem MEF Importe und Exporte von MEF-Contrib (link).Ich habe gelesen, die Codeplex-Dokumentation und Code-Junkie ' s blog post (link);aber ich kann nicht scheinen, um die Behälter zu erstellen, die Teile.Wohin gehe ich falsch?

Programm.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.Config-Abschnitt:

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

Ich bekomme keine build-Fehler und es läuft gut, wenn ich Schalter, um die typischen Attribut-basierten system, das ist Teil des MEF-core (mit den entsprechenden Katalog zu).Programm.- Kommandos ist immer NULL im obigen Beispiel.Ich habe versucht, nur verwenden eine einzigartige Eigenschaft anstelle einer Sammlung und Holen Sie sich die gleichen Ergebnisse.

Wenn ich Debuggen kann ich erhalten die Anbieter.Teile der Sammlung, so dass ich weiß, dass es den Zugriff auf die Konfiguration korrekt ist;allerdings bekomme ich eine InvalidOperationException, wenn ich debug-und versuchen Sie, bohren Sie in Katalog.Teile.

Wer noch keine Erfahrung, wie und wo gehe ich hier falsch?

War es hilfreich?

Lösung

Wie dokumentiert hier , müssen Sie auch diese in Ihrer Konfigurationsdatei:

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

Wenn Sie bereits, dass haben, dann könnte es interessant sein, uns zu zeigen, den Stack-Trace der InvalidOperationException, dass Sie erhalten, wenn provider.Parts erreichbar.

Andere Tipps

Ich hatte das gleiche Probleme und konnte es nicht bekommen zu arbeiten, aber hier sind einige details:Es scheint, dass ComposeParts() funktioniert nicht wie erwartet (zumindest in der version, die ich verwendet), weil es verwendet statische Methoden, basierend auf Reflexion finden Sie alle erforderlichen Importe (so scheint es, dass dieser Teil kann nicht geändert werden, außerhalb der MEF).Leider wollen wir mit xml-Konfiguration und nicht die MEF Parametern.

Es funktioniert, wenn Sie hinzufügen [Import] Attribute die Mitglieder der Klasse, die Sie verwenden Sie mit ComposeParts().In Ihrem Fall wäre dies "Programm".In diesem Fall werden alle Exporte in der Konfigurationsdatei definiert werden gefunden.

Ich konnte keine Dokumentation oder Beispiele zu den MEF-Contrib-Seite in Bezug auf dieses problem.Es gibt auch keine unittest in der MEF-contrib-projekt verwendet ComposeParts().Eine Problemumgehung wäre die Verwendung von container.GetExportedValues() zum abrufen der Werte, aber in diesem Fall müssen Sie die Klassen-Mitglieder manuell.

Hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top