Pregunta

Creo que estoy perdiendo la cabeza. :) He estado luchando con esto durante dos días. El código es correcto. Pero por alguna razón cuando intento acceder al campo [ImportMany], es nulo, o al menos no devolver ningún valor.

Obtener las 3 partes del catálogo, pero ellos no se aplica a la importación Lazy [] Estoy definiendo.

Aquí está mi código:

using System;
using System.Linq;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;

namespace MefTest
{

// Extension interface and metadata

    public interface IUIExtension
    {
       void DoSomething();
    }

    public interface IUIExtensionDetails
    {
        string Name { get; }
        string Uri { get; }
    }

    [MetadataAttribute]
    [AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
    public class UIExtensionAttribute : ExportAttribute
    {
        public UIExtensionAttribute() : base(typeof(IUIExtensionDetails)) { }

        public string Name { get; set; }
        public string Uri { get; set; }
    }

        // Extensions

    [UIExtension(Name="Test 01", Uri="http://www.yourmomma.com/")]
    public class Test1Extension : IUIExtension
    {
        public void DoSomething() { }
    }

    [UIExtension(Name = "Test 02", Uri = "http://www.yourdaddy.com/")]
    public class Test2Extension : IUIExtension
    {
        public void DoSomething() { }
    }

    [UIExtension(Name = "Test 03", Uri = "http://www.youruncle.com/")]
    public class Test3Extension : IUIExtension
    {
        public void DoSomething() { }
    }

        // Main program

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

        [ImportMany]
        public Lazy<IUIExtension, IUIExtensionDetails>[] Senders { get; set; }

        public void Run()
        {
            Compose();
        }

        public void Compose()
        {
            var catalog =  new AssemblyCatalog(
                System.Reflection.Assembly.GetExecutingAssembly());
            var container = new CompositionContainer(catalog);

            container.ComposeParts(this);

            // This is always 3
            Console.WriteLine(
                (from g in container.Catalog.Parts select g).Count());
            // This is always 0
            Console.WriteLine(Senders.Length);

            Console.ReadKey();
        }
    }

}
¿Fue útil?

Solución

Su atributo de metadatos es la definición de las exportaciones como typeof(IUIExtensionDetails) que es el contrato de metadatos, no su extensión real. Cambiar el constructor atributo personalizado a:

public UIExtensionAttribute() : base(typeof(IUIExtension)) { }

Otros consejos

Su error es aquí:

public UIExtensionAttribute() : base(typeof(IUIExtensionDetails))

Debe pasar el tipo de contrato allí, no el tipo de metadatos:

public UIExtensionAttribute() : base(typeof(IUIExtension))

(También, con el fin de asegurarse de que su clase exportación personalizada tiene las propiedades adecuadas como se espera por la importación de metadatos, lo haría implementa la interfaz IUIExtensionDetails. Pero eso no es obligatorio.)

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