1

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

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 属性仍然为空。如果我取消注释[Import]属性一切正常。

我应该怎么做才能导入没有属性?

4

1 回答 1

2

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

要使您的示例工作替换:

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

和:

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

并将其更改ImporterClass.Exporterpublic. MEF Conventions只允许在公共属性上导入。

于 2013-02-01T00:18:14.420 回答