Domanda

Ho provato a utilizzare il modello di fornitore configurabile per gestire le mie importazioni ed esportazioni MEF da MEF Contrib (collegamento).Ho letto la documentazione di Codeplex e il post sul blog di Code Junkie (collegamento);tuttavia, non riesco a convincere il contenitore a creare le parti.Dove sbaglio?

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

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

Non ricevo alcun errore di compilazione e funziona bene se passo al tipico sistema basato sugli attributi che fa parte del core MEF (con anche il catalogo appropriato).Program.Commands è sempre NULL nell'esempio precedente.Ho provato a utilizzare semplicemente una proprietà singolare anziché una raccolta e ottenere gli stessi risultati.

Quando eseguo il debug posso ottenere la raccolta provider.Parts in modo da sapere che sta accedendo correttamente alle informazioni di configurazione;tuttavia, ricevo un'eccezione InvalidOperationException ogni volta che eseguo il debug e provo ad approfondire catalog.Parts.

Qualcuno ha qualche esperienza su dove sto sbagliando qui?

È stato utile?

Soluzione

qui , è inoltre necessario questo nel file di configurazione:

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

Se si dispone già di che, allora potrebbe essere interessante per mostrarci la traccia dello stack del InvalidOperationException che si ottiene quando si accede provider.Parts.

Altri suggerimenti

Ho avuto gli stessi problemi e non sono riuscito a farlo funzionare, ma ecco alcuni dettagli:Sembra che ComposeParts() non funzioni come previsto (almeno nella versione che ho usato) perché utilizza metodi statici, basati su Reflection per trovare tutte le importazioni richieste (quindi sembra che questa parte non possa essere modificata dall'esterno di MEF).Sfortunatamente vogliamo utilizzare la configurazione xml e non gli attributi MEF.

Funziona se aggiungi attributi [Import] ai membri della classe che usi con ComposeParts().Nel tuo caso questo sarebbe "Programm".In questo caso verranno trovate tutte le esportazioni definite nel file di configurazione.

Non sono riuscito a trovare alcuna documentazione o esempio sulla pagina Contrib del MEF relativa a quel problema.Inoltre non esiste un test unitario nel progetto contrib MEF che utilizzi ComposeParts().Una soluzione alternativa potrebbe essere quella di utilizzare container.GetExportedValues() per recuperare i valori, ma in questo caso è necessario impostare manualmente i membri delle classi.

Spero che aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top