管理された拡張性フレームワーク

(事前にロシア語でごめんなさい)

MEFは、Microsoftが開発した新しいアプローチであり、アプリケーションの拡張機能を簡単にダウンロードできます。 これにより、すべて実行時にアプリケーションに含める必要のあるパーツを検出および構成できます。 新しいプラグインを追加するだけで、アプリケーションの動作を拡張できます。 Managed Extensibility Frameworkがこれをすべて行います。
「こんにちは、MEFワールド!」

すでに非常にシンプルなアプリケーションがあり、「 Hello MEF World! 」で迎えてもらいたいとします



クラスプログラム
{
static void Main(string [] args)
{
var program = new Program();
program.Run();
}

プライベートボイドラン()
{
ProgrammGreeter.SayHello();
}

保護されたIGreeter ProgrammGreeter {get; 設定;}
}


パブリックインターフェイスIGreeter
{
void SayHello();
}

パブリッククラスGreeter:IGreeter
{
public void SayHello()
{
Console.WriteLine( "Hello MEF World!");
}
}
主な問題は、 ProgrammGreeterプロップにインスタンスを持つことです。 これがGreeterクラスのインスタンスに勝つようにします。
MEFでやろう

これを行うには、 System.ComponentModel.Compositionへのリンクを含める必要があります。

MSDNによると、「MEFは不可欠な部分です。 NET Framework 4 Beta1。NETFrameworkを使用できる場所であればどこでも使用されます。

ほとんどの場合、MEFはNET Framework 4.0に含まれますが、 CodePlex Webサイトからダウンロードできます。


リンクを追加したら、 インポート(インポート)およびエクスポート(エクスポート)属性を追加できます。
エクスポートは、どこかで使用したい機能を示すことを目的としています。 インポートは、機能への依存関係を指定することを意味します。

Greeterクラスはいくつかの機能を提供するため、 Exportを追加します。

[エクスポート(typeof(IGreeter))]
パブリッククラスGreeter:IGreeter

Programmクラスでこの機能を使用したい、つまり この機能に依存しています。 インポートの追加:

[インポート]
保護されたIGreeter ProgrammGreeter {get; セット; }

通常、機能は他のアセンブリに存在します。 ただし、呼び出されたアセンブリに住むこともできます。 いずれにせよ、すべての依存関係を構成する方法をMEFに伝える必要があります。
これは、機能を使用する前に呼び出すCompose()メソッドを使用して実行できます。このようなセットアップは、実行の開始時にどこかで行われるためです。

プライベートボイドラン()
{
作成();
ProgrammGreeter.SayHello();
}

private void Compose()
{
var assemblyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var compositionContainer =新しいCompositionContainer(assemblyCatalog);
compositionContainer.ComposeParts(this);
}


私は自分のプログラムを実行して得た



Managed Extensibility Frameworkはどのように機能しますか?

Compose ()メソッドに興味があると思います。 このメソッドのコードのコメントを読むだけで、メソッドをより詳細に作成しました。

// MEFが必要なすべてを作成する方法をガイドする必要があります
private void Compose()
{
//カタログは機能を検索する場所を示します(エクスポートはどこで実行されますか)
var assemblyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
// CompositionContainerは定義された依存関係を保持し、作成を調整します
var compositionContainer =新しいCompositionContainer(assemblyCatalog);

// CompositionBatchオブジェクトは、構成する必要があるすべてのオブジェクトへの参照を保持します
var compositionBatch =新しいCompositionBatch();
//そのようなオブジェクトの1つはProgrammインスタンス(これ)であり、構成する必要があります
compositionBatch.AddPart(this);

//最後に、コンテナにはComposeというメソッドがあり、実際に実行します
compositionContainer.Compose(compositionBatch);
}



Managed Extensibility Frameworkには、 ComposablePartと呼ばれるプリミティブがあり、 カタログからのアプリケーションコレクションの拡張が含まれています。 ただし、ビルドする必要がある依存関係も含まれる場合があります。

Managed Extensibility Framework ページからこのグラフをご覧ください



より複雑な例

この例では、XMLファイル(一部の開発者に関する情報を含む)を解析するアプリケーションがあります。 プログラムをクライアントに配信した後、このXMLでいくつかのルールをテストできるようにしますが、それらはクライアントごとに異なる場合があります。 このため、ルールはさまざまなクライアントに提供される個別のDllで開発されます。 プラグインと同様にルールを使用します。


2つのアセンブリがあります。


次の図に示すクラス構造。 すべてのルールのロジックの説明で退屈したくありません。 (ソートが必要な場合はお知らせください。)



Programmクラスは別のアセンブリからルールをロードするため、MEF.RulesでルールをImportでマークします。

[インポート]
public ISecurityRule SecurityRule {get; セット; }

[ImportMany]
public IDataRule [] DataRules {get; セット; }

public void Run()
{
Console.WriteLine( "Programm run。");
作成();
Console.WriteLine( "Composition completed。");

var document = XDocument.Load( "developer.xml");
Console.WriteLine(document.ToString());

var PassValidation = SecurityRule.PassesValidation(ドキュメント);
Console.WriteLine(string.Format( "ルール{0}:{1}"、SecurityRule.GetType()、passsValidation));

foreach(DataRulesの変数d)
{
var valid = d.IsValid(ドキュメント);
Console.WriteLine(string.Format( "ルール{0}:{1}"、d.GetType()、有効));
}
}

お気づきのように、 ImportManyを使用します。名前がそれ自体を意味することを願っています。

Composeリンク方法を変更して、アプリケーションが置かれているディレクトリからExportを探すようにする必要があります。そのためにDirectoryCatalogを使用します。

private void Compose()
{
var catalog = new DirectoryCatalog(Environment.CurrentDirectory);
var container = new CompositionContainer(カタログ);
container.ComposeParts(これ);
}


これらのDLLを1つのフォルダーに入れてMEF.DEMOを実行すると、次のようになりました。



MEFの目標は、アプリケーションの他の部分から機能をインポートするクラスと、この機能をエクスポートするクラスをシームレスに接着することです。 おそらく、MEFが別のDIコンテナであると判断した場合。 はい、それはまだDIコンテナと同じかもしれませんが、Managed Extensibility Frameworkは主に構成に焦点を当てています。 また、プログラムの実行中に都合の良いときにいつでも構成を作成できることも重要です。 やりたいときにいつでも再構成できます。 必要に応じて機能をロード( 遅延ロード )したり、エクスポートにメタデータを追加したりすることもできます。 フォルダー内の依存関係の検索は、 フィルター処理を使用して実行できます 。 DIコンテナにはない他の多くの機能もあります。


Managed Extensibility Frameworkは 、NET 4.0 Frameworkに追加され非常に興味深い必要な機能です。


ソース: MEF.DEMO.ZIPをダウンロード-118.46 KB

Source: https://habr.com/ru/post/J83928/


All Articles