【MEF】CatalogExportProvider使ってみる。

  • 2010.05.20 Thursday
  • 23:12
JUGEMテーマ:コンピュータ

ExportProviderを継承するクラスがいっぱいあるみたいですが、そのひとつを使ってみました。

CatalogExportProviderクラス
指定したカタログで宣言されたすべての Export オブジェクトへのアクセスを提供します。

名前空間:  System.ComponentModel.Composition.Hosting
アセンブリ:  System.ComponentModel.Composition (System.ComponentModel.Composition.dll 内)

SourceProvider プロパティに何もいれずに実行したら、ちゃんと入れろって例外がとんできました。とても親切で感動しますね。

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace MEFSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var catalogExportProvider = new CatalogExportProvider(new TypeCatalog(new [] { typeof(A) }))
                                            {
                                                SourceProvider =
                                                    new CompositionContainer(new TypeCatalog(new[] {typeof (B)}))
                                            };
            IA a = catalogExportProvider.GetExportedValue<IA>();
            a.Say();
        }
    }
    public interface IA
    {
        void Say();
    }
    public interface IB
    {
        void Say();
    }
    [Export(typeof(IA))]
    class A : IA
    {
        [Import]
        public IB B { get; set; }
        public void Say()
        {
            B.Say();
        }
    }
    [Export(typeof(IB))]
    class B : IB
    {
        public void Say()
        {
            Console.WriteLine("B Say");
        }
    }
}

CatalogExportProviderオブジェクトとCompositionContainerオブジェクトで別々に指定したパーツがめでたく合成されました。

実行結果は
-------------------
B Say




上記を下記のようにAとBをひっくり返すと合成に失敗します。


    class Program
    {
        static void Main(string[] args)
        {
            var catalogExportProvider = new CatalogExportProvider(new TypeCatalog(new [] { typeof(B) }))
                                            {
                                                SourceProvider =
                                                    new CompositionContainer(new TypeCatalog(new[] {typeof (A)}))
                                            };
            IA a = catalogExportProvider.GetExportedValue<IA>();
            a.Say();
        }
    }

System.ComponentModel.Composition.ImportCardinalityMismatchException はハンドルされませんでした。
  Message=制約 '((exportDefinition.ContractName == "MEFSample.IA") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "MEFSample.IA".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))' に一致する有効なエクスポートが見つかりませんでした。無効なエクスポートが拒否されている可能性があります。
  Source=System.ComponentModel.Composition
  StackTrace:
       場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition, AtomicComposition atomicComposition)
       場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportsCore(Type type, Type metadataViewType, String contractName, ImportCardinality cardinality)
       場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportedValueCore[T](String contractName, ImportCardinality cardinality)
       場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportedValue[T](String contractName)
       場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportedValue[T]()
       場所 MEFSample.Program.Main(String[] args) 場所 c:¥users¥art55¥documents¥visual studio 2010¥Projects¥MEFSample¥MEFSample¥Program.cs:行 17
       場所 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       場所 System.Threading.ThreadHelper.ThreadStart()
  InnerException:

まあこんな使い方はしないですね・・・。たぶん。


----
追記)

    class Program
    {
        static void Main(string[] args)
        {
            var catalogExportProvider = new CatalogExportProvider(new TypeCatalog(new Type[0]))
                                            {
                                                SourceProvider =
                                                    new CompositionContainer(new TypeCatalog(new[] { typeof(A), typeof (B)}))
                                            };
            IA a = catalogExportProvider.GetExportedValue<IA>();
            a.Say();
        }
    }

これもダメでした・・・・うん??
コメント
コメントする








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

calendar

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     
<< April 2018 >>

あわせて読みたい

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

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