管理された拡張性フレームワーク
この章では、Managed Extensibility Framework(MEF)について説明します。MEFは、サードパーティのプラグインの拡張性に使用できます。または、疎結合のプラグインのようなアーキテクチャの利点を通常のアプリケーションにもたらすことができます。
MEFは、軽量で拡張可能なアプリケーションを作成するためのライブラリです。
これにより、アプリケーション開発者は、構成を必要とせずに拡張機能を検出して使用できます。
MEFは.NETFramework 4の不可欠な部分であり、大規模なアプリケーションの柔軟性、保守性、およびテスト性を向上させる.NETFrameworkが使用されている場所ならどこでも利用できます。
MEFは、Windowsフォーム、WPF、その他のテクノロジを使用しているかどうかに関係なく、クライアントアプリケーション、またはASP.NETを使用するサーバーアプリケーションで使用できます。
MEFはとして移植されました Microsoft.Composition .NET Coreにも、部分的に。
のみ System.Composition 移植され、 System.ComponentModel.Compositionまだ利用できません。つまり、ディレクトリ内のアセンブリからタイプをロードできるカタログがありません。
この章では、.NETCoreアプリケーションでMEFを使用する方法についてのみ学習します。
.NETCoreコンソールアプリケーションでMEFを使用する簡単な例を理解しましょう。ここで、新しい.NETCoreコンソールプロジェクトを作成しましょう。
左側のペインで、 Templates → Visual C# → .NET Coreを選択し、中央のペインで[コンソールアプリケーション(.NET Core)]を選択します。
「名前」フィールドにプロジェクトの名前を入力し、「OK」をクリックします。
プロジェクトが作成されたら、MEFを使用できるように、Microsoft.Compositionの参照を追加する必要があります。これを行うには、ソリューションエクスプローラーでプロジェクトを右クリックし、Manage NuGet Packages…
検索する Microsoft.Composition をクリックします Install。
クリック OK ボタン。
クリック I Accept ボタン。
インストールが完了すると、リファレンスにエラーが表示されます。
開いてみましょう project.json ファイル。
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.Composition": "1.0.30",
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.1"
}
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
}
}
}
あなたはそれを見ることができます Microsoft.Composition 依存関係が追加されますが、問題はこのパッケージがと互換性がないことです dnxcore50。だから私たちはインポートする必要がありますportablenet45+win8+wp8+wpa81。今すぐ交換しましょうproject.json 次のコードでファイルします。
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.Composition": "1.0.30",
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.1"
}
},
"frameworks": {
"netcoreapp1.0": {
"imports": "portable-net45+win8+wp8+wpa81"
}
}
}
このファイルを保存すると、エラーが修正されたことがわかります。
参照を展開すると、の参照が表示されます Microsoft.Composition。
まず、エクスポートするインターフェイスを作成してそのインターフェイスを実装し、クラスをexport属性で装飾する必要があります。新しいクラスを追加しましょう。
[名前]フィールドにクラスの名前を入力し、[ Add。
次のコードをに追加しましょう PrintData.cs ファイル。
using System;
using System.Collections.Generic;
using System.Composition;
using System.Linq;
using System.Threading.Tasks;
namespace MEFDemo {
public interface IPrintData {
void Send(string message);
}
[Export(typeof(IPrintData))]
public class PrintData : IPrintData {
public void Send(string message) {
Console.WriteLine(message);
}
}
}
上記のように、カタログはMicrosoft.Composition名前空間では使用できません。そのため、Program.csファイルのComposeメソッドに示されているように、エクスポート属性を使用してアセンブリからすべてのタイプをロードし、インポート属性にアタッチします。
using System;
using System.Collections.Generic;
using System.Composition;
using System.Composition.Hosting;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace MEFDemo {
public class Program {
public static void Main(string[] args) {
Program p = new Program();
p.Run();
}
public void Run() {
Compose();
PrintData.Send("Hello,this is MEF demo");
}
[Import]
public IPrintData PrintData { get; set; }
private void Compose() {
var assemblies = new[] { typeof(Program).GetTypeInfo().Assembly };
var configuration = new ContainerConfiguration()
.WithAssembly(typeof(Program).GetTypeInfo().Assembly);
using (var container = configuration.CreateContainer()) {
PrintData = container.GetExport<IPrintData>();
}
}
}
}
アプリケーションを実行してみましょう。インスタンス化することで、アプリケーションが実行されていることがわかります。 PrintData クラス。
MEFの詳細については、次のURLにアクセスしてください。 https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx 詳細については。