Frage

Ich denke, ich meine Meinung bin zu verlieren. :) Ich habe jetzt zwei Tage lang kämpfen mit diesem. Der Code sieht richtig. Aber aus irgendeinem Grund, wenn ich versuche, das [ImportMany] Feld zuzugreifen, ist es null oder zumindest keine Werte zurück.

Es erhält die 3 Teile im Katalog, aber nicht auf den faulen [] Import angewandt wird ich definieren bin.

Hier ist mein Code:

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

}
War es hilfreich?

Lösung

Ihr Metadaten-Attribut wird die Definition der Exporte als typeof(IUIExtensionDetails) die Metadaten Vertrag ist, nicht die tatsächliche Erweiterung. Ändern Sie das benutzerdefinierte Attribut Konstruktor:

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

Andere Tipps

Ihr Fehler ist hier:

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

Sie sollten den Vertragstyp es passieren, nicht den Metadatentyp:

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

(Auch, um sicher zu stellen, dass Ihre benutzerdefinierten Export Klasse die richtigen Eigenschaften hat, wie durch den Import mit Metadaten zu erwarten, ich würde es die IUIExtensionDetails Schnittstelle machen implementieren. Aber das ist nicht zwingend erforderlich.)

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