неожиданный результат в меф - PullRequest
3 голосов
/ 30 июня 2011

Я новичок в MEF.Я пишу этот код, но не могу понять, почему программа показывает этот результат.

namespace ConsoleApplication1
{
    public class MEFTest
    {
         [Import]
        public string Text { get; set; }

        [Import]
        public IExtension Ext { get; set; }

        public void ShowText()
        {
            AssemblyCatalog asscatalog = new AssemblyCatalog(typeof(Extension2).Assembly);
            CompositionContainer container = new CompositionContainer(asscatalog);

            CompositionBatch batch = new CompositionBatch();
            batch.AddPart(this);

            container.Compose(batch);

            Console.WriteLine(Text);
            Console.WriteLine(Ext.Text);
        }
    }
    class Program
    {
        static void Main( string[] args )
        {
            MEFTest mef = new MEFTest();

            mef.ShowText();

            Console.ReadKey();
        }
    }

    public interface IExtension
    {
        string Text { get; set; }
    }

    [Export]
    public class Extension1 : IExtension
    {
        [Export]
        public string Text { get; set; }

        public Extension1()
        {
            Text = "From Extension1.";
        }
    }

    [Export(typeof(IExtension))]
    public class Extension2 : IExtension
    {
       // [Export(typeof(IExtension).GetProperties()[0].GetType())]
        public string Text { get; set; }

        public Extension2()
        {
            Text = "From Extension2.";
        }
    }
} 

Результат:

Из Extension1.Из Extension2.

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

Это только то, как MEF соответствует вашему импорту. Так как у вас есть:

    [Import]
    public string Text { get; set; }

В этом случае MEF находит «строковый текст» и выполняет сопоставление. Это происходит из Extention1, но только потому, что вы явно добавили экспорт в его свойство Text .

    [Import]
    public IExtension Ext { get; set; }

Находит фактический Export типа IExtension. Единственный из них - ваш Extension2 класс. Это соответствует этому требованию.

0 голосов
/ 30 июня 2011

Extension1 объявляет, что он экспортирует себя (тип Extension1, а не интерфейс) и экспортирует свойство с именем Text типа string.

В композиции это будет связано со свойством Text, помеченным как import.

Extension2 объявляет, что экспортирует тип IExtension.Это будет связано со свойством Ext, помеченным для импорта IExtension.

...