【MEF】DirectoryCatalogを試してみる。

  • 2010.05.12 Wednesday
  • 22:03

Source and Project

前回のMEF関連のカタログの概念がよくわからないと書きましたが、MSDNライブラリを眺めていると、日本語でしっかりと説明が書かれいました。斜め読みしていたため見落としてました。

MSDNによると

  • パート、カタログ、および合成コンテナー

    パートと合成コンテナーは、MEF アプリケーションの基本のビルド ブロックです。パートは、それ自体までの (自身を含む) 値をインポートまたはエクスポートするオブジェクトです。カタログは、特定のソースからのパートのコレクションを提供します。合成コンテナーは、カタログによって提供されるパートを使用して合成 (インポートのエクスポートへの結合) を実行します。

  • インポートとエクスポート

    インポートとエクスポートは、コンポーネントが通信を行う手段です。インポートを使用して、コンポーネントは特定の値またはオブジェクトが必要であることを指定します。エクスポートを使用して、コンポーネントは値が使用可能であることを指定します。各インポートは、コントラクトを通じて、エクスポートの一覧と対応付けされます。

    http://msdn.microsoft.com/ja-jp/library/dd460648(v=VS.100).aspx#conclusion

    とあります。個人的には非常にわかりやすい説明だと思います。また、クラスの説明に関してもじっくり眺めるとカタログの概念がなんとなくわかってきました。しかし、まだ自分の言葉で書き下せるほどは理解していないというのが現状です。

    まあとにもかくにもコードが書きたい人間なので今回はDirectoryCatalogを試してみました。クラス名だけを頼りに直感でコードを書いてみました(笑)

    今回はパーツとなるモジュールを分けています。

    登場するDLLは、インターフェイスを定義しているILogic.dllとその実装モジュールであるLogicImpl.dll、そして、コンテナ経由で得たインスタンスを実行するMEFSample20100512_001.exeです。

    まずはILogic.dllの説明から

    namespace ILogic
    {
        public interface ISay
        {
            void Execute();
        }
    }

    と、インターフェイスを1つ定義しておきます。

    LogicImpl.dllはILogic.dllを参照します。

    using System;
    using System.ComponentModel.Composition;
    using ILogic;

    namespace LogicImpl
    {
        [Export(typeof(ISay))]
        public class SayImpl : ISay
        {
            public void Execute()
            {
                Console.WriteLine("にゃー");
            }
        }
    }

    Executeメソッドが呼び出されると「にゃー」が出力されます。
    今回は属性プログラミングモデルを採用しています。エクスポートのコントラクトに型情報をしています。

    最後にMEFSample20100512_001.exeですが、コンテナを経由して、ISayを実行します。

    using System;
    using System.ComponentModel.Composition.Hosting;
    using System.IO;
    using ILogic;

    namespace MEFSample20100512_001
    {
        class Program
        {
            static void Main()
            {
                var catalog = new AggregateCatalog();
                catalog.Catalogs.Add(new DirectoryCatalog(Path.Combine(Environment.CurrentDirectory, "lib")));
                var container = new CompositionContainer(catalog);
                var say = container.GetExportedValue<ISay>();
                say.Execute();
            }
        }
    }


    catalog.Catalogs.Add(new DirectoryCatalog(Path.Combine(Environment.CurrentDirectory, "lib")));
    var container = new CompositionContainer(catalog);

    実行モジュールの直下のlibディレクトからパーツを探す、コンテナに提供します。


    var say = container.GetExportedValue<ISay>();

    指定した型がコントラクトとなっているパーツを検索しLasyクラス経由でインスタンスを受け取ります。
    そしてExecuteメソッドを実行という形です。

    意外と簡単に実装できたので拍子抜けです。

    Source and Project

  • コメント
    管理者の承認待ちコメントです。
    • -
    • 2018/04/02 3:20 PM
    コメントする








        
    この記事のトラックバックURL
    トラックバック

    calendar

    S M T W T F S
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
    << May 2019 >>

    あわせて読みたい

    あわせて読みたいブログパーツ

    selected entries

    categories

    archives

    recent comment

    • 【キーボード】6年前のRealForceを復活させることはできる!?その3
      art55 (05/22)
    • 【キーボード】6年前のRealForceを復活させることはできる!?その3
      分解大好き (05/18)
    • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
      art55 (02/04)
    • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
      Gen (02/04)
    • 【キーボード】RealForce が壊れて帰ってきた。
      art55 (04/29)
    • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
      art55 (02/23)
    • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
      かるあ (02/22)
    • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
      art55 (01/16)
    • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
      karuakun (01/16)
    • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
      art55 (12/05)

    recent trackback

    recommend

    recommend

    recommend

    C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
    C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
    Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

    recommend

    ろんりと集合
    ろんりと集合 (JUGEMレビュー »)
    中内 伸光
    とてもわかりやすいです。

    recommend

    recommend

    シャノン・ノイマン・ディジタル世界
    シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
    市川 忠男
    4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

    recommend

    recommend

    東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
    東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

    テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

    recommend

    recommend

    プログラミング.NET Framework 第4版 (プログラミングシリーズ)
    プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
    Jeffrey Richter
    発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

    recommend

    recommend

    キャット・シッターの君に。
    キャット・シッターの君に。 (JUGEMレビュー »)
    喜多嶋 隆
    私のイラストレータデビュー本です。

    recommend

    Essential .NET ― 共通言語ランタイムの本質
    Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
    ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

    links

    profile

    search this site.

    others

    mobile

    qrcode

    powered

    無料ブログ作成サービス JUGEM