MEF 2无属性导入

时间:2013-01-31 10:36:19

标签: c# mef

我正在使用MEF 2开发一个应用程序。我想尝试无属性的设计插件的方法,现在我想弄清楚为什么我的一个对象似乎不满足它的Import。 以下是示例代码。

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Registration;
using System.Reflection;

namespace MEF2
{
    class Program
    {
        static void Main(string[] args)
        {
            var builder = new RegistrationBuilder();
            builder.ForType<ExporterClass>().Export<ExporterClass>();
            builder.ForType<ImporterClass>().Export().ImportProperties(p => p.Name == "Exporter");
            var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), builder);
            CompositionContainer container = new CompositionContainer(catalog);
            ImporterClass t = new ImporterClass();
            container.ComposeParts(t);
            t.ShowWalkers();
        }
    }

    public class ExporterClass
    {
        public void Write()
        {
            Console.WriteLine("Test");
        }
    }

    public class ImporterClass : IPartImportsSatisfiedNotification
    {
        //[Import]
        private ExporterClass Exporter { get; set; }

        public void ShowWalkers()
        {
            if (Exporter != null)
                Exporter.Write();
        }
        public void OnImportsSatisfied()
        {
            Console.WriteLine("IPartImportsSatisfiedNotification");
        }
    }
}
触发了

OnInputSatisfied事件,但Exporter属性仍然为null。如果我取消注释[Import]属性,一切正常。

如果没有属性导入,我该怎么办?

1 个答案:

答案 0 :(得分:2)

我不确定您是否可以将CompositionContainer.ComposeParts与MEF约定一起使用。我认为这仅适用于归因模型。

让您的示例替换:

ImporterClass t = new ImporterClass();        
container.ComposeParts(t);

使用:

ImporterClass t = container.GetExportedValueOrDefault<ImporterClass>();

并将ImporterClass.Exporter更改为publicMEF Conventions仅允许在公共媒体资源上导入。

相关问题