C#プログラミングスケーラブルMEFの研究ノート(5):MEFアドバンスアドバンス

久しぶりの書き込みブログ、今日は記事のMEFのシリーズを書くために時間を割い続けます。公園の友人は、私は1つをする時間を見つけて、それは、簡単に見えますが、この一連の記事は、ディレクトリをすることで作られている、各記事の最終置きます。

4前MEF、完成学校の基礎を言う4の前には、より一般的に使用されるMEFは基本的に終了している、私たちはMEFによってもたらされる利便性を見ることができたと考えています。MEFの今日は、誰も会談の詳細珍しい事のいくつかの、いわゆる、より高度な使い方をいくつか紹介します。

エクスポートエクスポート注釈の前で言えばが輸出を達成するために、上記の各カテゴリに追加され、それを行うために、より便利な方法はありますか?答えはそう長くクラスとして実装し、このインタフェースは、上記の各カテゴリでのメモを記述することなく、エクスポートされることを、上記のインターフェースでメモを書くために、イエスです。唯一のソースインタフェースと実装クラス、および残りの缶模倣の下に掲示されます:

インターフェイスのコードは次のとおりです。

コードをコピー
使用してシステムを。
使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。使用してSystem.Textのを。使用してSystem.ComponentModel.Compositionを。名前空間BankInterface {[InheritedExport] パブリックインターフェイスICard { // 账户金额ダブルマネー{ 取得します。セット; } // 获取账户信息ストリングGetCountInfo()。// 存钱無効SaveMoney(ダブル金)。// 取钱無効CheckOutMoney(ダブル金)。}}
コードをコピー

インターフェイス上の[InheritedExport]マークを追加しました、はい、これは上記のコメントで使用されるインタフェースです。

以下に示した実装クラスのコード:

コードをコピー
使用してシステムを。
使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。使用してSystem.Textのを。使用してBankInterfaceを。使用してSystem.ComponentModel.Compositionを。名前空間BankOfChina { // [エクスポート(typeof演算(ICard))] パブリッククラスZHCard:ICard { 公共の文字列GetCountInfo(){ リターン" 中国銀行" } 公共ボイドSaveMoney(二重お金){ this.Money + = お金。} パブリック無効CheckOutMoney(ダブルお金){ this.Money - = お金。} 公共の二重のお金を{ 取得します。セット; }}}
コードをコピー

あなたが見ることができる、私はすでに知っている見た前回の結果、まだ見ることができ、あるいは、導出され、実行されている、注釈の輸出をコメントアウト。

注:この方法は比較的簡単ですが、比較的単純なアプリケーションに適用されますが、以下のことを読んだ後、私たちは彼の欠点に気付くであろうと信じています。

 

以下は、今日のフォーカスを入力します。

 特定のオブジェクトにアクセスする方法MEF                                                                      

  以前我々は由来場合、特定のオブジェクトを識別するために、注釈名寄せ[エクスポート()]に添加することができるが、この方法は、唯一のオープンページを導入することなく、ラインフィルタのページの初期化に使用され、前に述べました彼は、もはや私たちは、インポートのコレクションで、その違いを区別することはできません、インポートすべてのクラスが識別されていないことを、インポートすることができませんでした。

  次のように各クラスにIDを追加するために、我々はExportAttributeクラスを継承したい、彼のためにIDプロパティのメタデータを追加し、最初のExportAttributeクラスコードから継承書くために、すべてのです。

コードをコピー
使用してシステムを。
使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。使用してSystem.Textのを。使用してSystem.ComponentModel.Compositionを。名前空間BankInterface { /// <要約> /// AllowMultiple =偽、代表一个类不允许多次使用此属性/// </要約> [MetadataAttribute] [AttributeUsage(AttributeTargets.Class、AllowMultiple = )] パブリッククラスExportCardAttribute:ExportAttribute { パブリックExportCardAttribute():ベース(typeof演算(ICard)){} パブリック文字列カード型{取得する; セット; }}}
コードをコピー

コードは、親クラスのコンストラクタの呼び出しは非常にシンプルで、次のように、追加ICard直接インタフェースファイルを変更するインタフェースの下に、プロパティCatdTypeを宣言します。

コードをコピー
使用してシステムを。
使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。使用してSystem.Textのを。使用してSystem.ComponentModel.Compositionを。名前空間BankInterface { パブリックインターフェイスICard { // 账户金额{ダブルマネー取得します。セット; } // 获取账户信息ストリングGetCountInfo()。// 存钱無効SaveMoney(ダブル金)。// 取钱無効CheckOutMoney(ダブル金)。} パブリックインターフェイスIMetaData {ストリングカード型{ GET ;}}}
コードをコピー

このプロパティに注意を払うには、IMetaDataインターフェイスのみプロパティを1つ追加し、ちょうど輸出を達成するように、ExportCardAttributeクラス属性名が一致するように書いています。

ここでは、エクスポートするクラスをマークするために私たちのExportCardAttribute属性を持ちます:

コードをコピー
使用してシステムを。
使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。使用してSystem.Textのを。使用してBankInterfaceを。使用してSystem.ComponentModel.Compositionを。名前空間BankOfChina {[ExportCardAttribute(CARDTYPE = " BankOfChina " )] パブリッククラスZHCard:ICard { 公共の文字列GetCountInfo(){ リターン" 中国銀行" } 公共ボイドSaveMoney(二重お金){ this.Money + = お金。} パブリック空CheckOutMoney(ダブル金){ this.Money - = お金。} 公共の二重のお金を{ 取得します。セット; }}}
コードをコピー

ここでは、異なるデータ・タイプは、状況に応じて使用することができる、カード型のプロパティを設定することができます。

今、私たちは、メインプログラムのコードを変更します。

コードをコピー
使用したシステムを、
 使用System.Collections.Generic; 使用System.Linqの、使用System.Textの、使用するSystem.Reflectionを、使用System.ComponentModel.Compositionを、使用System.ComponentModel.Composition.Hostingを、使用BankInterface; 名前空間MEFDemo { クラスプログラム{ // AllowRecomposition =真の動作パラメータは[ImportMany(= AllowRecomposition。正常に装着されている組換え体新しいメンバに設定することが可能で示す場合はtrue )] 公共のIEnumerable <レイジー<iCard、IMetaDataカード>> { GET; セット;} 静的な無効メイン(文字列[]引数){プログラムプロ= 新しいプログラム()。pro.Compose(); foreachの(VARのC pro.cards){ (c.Metadata.CardType ==もし" BankOfChina " ){Console.WriteLineを(" ここで中国の銀行のカードです" ); Console.WriteLineを(c.Value.GetCountInfo())。} (c.Metadata.CardType ==場合NongHang ){Console.WriteLineを(ここノンイエ陰ハングのカードです)。Console.WriteLineを(c.Value.GetCountInfo())。}} Console.Read()。} プライベート無効作曲(){ VARカタログ= 新DirectoryCatalog("カード" ); VARコンテナが= 新しいCompositionContainer(カタログ); container.ComposeParts(この);}}}
コードをコピー

ここで私はレイジーレイジーローディング機構(特に参照使用レイジー遅延ロード)、我々は、インポートのタイプを区別するように、我々はメタデータの性質、カードのタイプを決定するために基づいてCARDTYPEプロパティへのアクセス権を持っていることがわかりますが

おすすめ

転載: www.cnblogs.com/ljdong7/p/12107732.html