Pregunta

He estado intentando utilizar el modelo de proveedor configurable para manejar mis importaciones y exportaciones MEF desde MEF Contrib (enlace).He leído la documentación de Codeplex y la publicación del blog de Code Junkie (enlace);sin embargo, parece que no puedo conseguir que el contenedor cree las piezas.¿Dónde me estoy equivocando?

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

Sección 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>

No recibo ningún error de compilación y funciona bien si cambio al típico sistema basado en atributos que forma parte del núcleo de MEF (también con el catálogo apropiado).Program.Commands siempre es NULL en el ejemplo anterior.Intenté usar una propiedad singular en lugar de una colección y obtuve los mismos resultados.

Cuando depuro puedo obtener la colección de proveedores.Parts para saber que está accediendo a la información de configuración correctamente;sin embargo, obtengo una InvalidOperationException cada vez que depuro e intento profundizar en catalog.Parts.

¿Alguien tiene alguna experiencia sobre dónde me estoy equivocando aquí?

¿Fue útil?

Solución

aquí , también es necesario esto en el fichero de configuración:

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

Si ya tienes eso, entonces podría ser interesante para mostrarnos el seguimiento de la pila de la InvalidOperationException que se obtiene cuando se accede a provider.Parts.

Otros consejos

Tuve los mismos problemas y no pude hacerlo funcionar, pero aquí hay algunos detalles:Parece que ComposeParts() no funciona como se esperaba (al menos en la versión que usé) porque usa métodos estáticos, basados ​​en Reflection para encontrar todas las Importaciones requeridas (por lo que parece que esta parte no se puede cambiar desde fuera de MEF).Desafortunadamente queremos usar la configuración xml y no los atributos MEF.

Funciona si agrega atributos [Importar] a los miembros de la clase que usa con ComposeParts().En su caso, esto sería "Programa".En este caso se encontrarán todas las exportaciones definidas en el archivo de configuración.

No pude encontrar ninguna documentación o ejemplos en la página de MEF Contrib relacionados con ese problema.Además, no existe una prueba unitaria en el proyecto MEF contrib que utiliza ComposeParts().Una solución alternativa sería utilizar contenedor.GetExportedValues() para recuperar los valores, pero en este caso hay que configurar los miembros de las clases manualmente.

Espero que ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top