1

MEF 2 を使用してアプリケーションに取り組んでいます。プラグインを設計する属性のない方法を試してみたかったのですが、現在、オブジェクトの 1 つがそのインポートを満たしていないように見える理由を理解しようとしています。以下はサンプルコードです。

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]属性のコメントを外すと、すべてが機能します。

属性なしでインポートするにはどうすればよいですか?

4

1 に答える 1

2

MEF規則でCompositionContainer.ComposePartsを使用できるかどうかはわかりません。アトリビューションモデル専用だと思います。

サンプルを機能させるには、次のように置き換えます。

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

と:

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

そして、をに変更ImporterClass.Exporterpublicます。MEF Conventionsパブリックプロパティでのみインポートを許可します。

于 2013-02-01T00:18:14.420 に答える