MEFの基礎(ExportとImport)

あまり MEF の意義を理解していないように思うが、徒然なるままに。



Addin1.cs

using System.ComponentModel.Composition;

namespace test.mef.basic
{
    [Export]
    public class Addin1
    {
        /// <summary>
        /// メッセージ
        /// </summary>
        public string Msg
        {
            get { return "Addin1です"; }
        }
    }
}



Addin2.cs

using System;
using System.ComponentModel.Composition;

namespace test.mef.basic
{
    [Export]
    public class Addin2
    {
        /// <summary>
        /// 整数足し算
        /// </summary>
        public void addInts(int x, int y)
        {
            Console.WriteLine("Addin2より:結果は {0} です。", (x + y));
        }
    }
}



Module1.cs

using System;
using System.ComponentModel.Composition;

namespace test.mef.basic
{
    public class Module1
    {
        //Addin1をインポート
        [Import]
        private Addin1 a1 { get; set; }

        //Addin2をインポート
        [Import]
        private Addin2 a2 { get; set; }

        /// <summary>
        /// Addin1のMsgを表示
        /// </summary>
        public void showMsg()
        {
            Console.WriteLine(a1.Msg);
        }

        /// <summary>
        /// Addin2のaddIntsを実行
        /// </summary>
        public void executeAdd(int x, int y)
        {
            a2.addInts(x, y);
        }
    }
}



Program.cs

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

namespace test.mef.basic
{
    class Program
    {
        static void Main(string[] args)
        {
            //現在実行中のアセンブリからカタログを作成
            var catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));

            //カタログからコンテナを生成
            var container = new CompositionContainer(catalog);

            //モジュール1のインポートを満たす
            var m1 = new Module1();
            container.SatisfyImportsOnce(m1);

            m1.showMsg();
            m1.executeAdd(2,3);
#if DEBUG
            Console.ReadLine();
#endif
        }
    }
}



結果

Addin1です
Addin2より:結果は 5 です。



ちなみにProgram.csにSystem.ComponentModel.Compositionの参照がないと「引数 1: '・・・' から 'System.ComponentModel.Composition.Primitives.ComposablePart' に変換できません」とエラーがでて怒られます。エラーメッセージから推測できずちょっとはまった。