Dotnet-core-managed-extensibility-framework
管理された拡張性フレームワーク
この章では、Managed Extensibility Framework(MEF)について説明します。 MEFは、サードパーティ製のプラグインの拡張性のために使用することも、疎結合のプラグインのようなアーキテクチャの利点を通常のアプリケーションにもたらすこともできます。
- MEFは、軽量で拡張可能なアプリケーションを作成するためのライブラリです。
- アプリケーション開発者は、構成を必要とせずに拡張機能を検出して使用できます。
- MEFは.NET Framework 4に不可欠な部分であり、.NET Frameworkが使用されている場合はいつでも利用でき、大規模アプリケーションの柔軟性、保守性、およびテスト容易性を向上させます。
- MEFは、Windows Forms、WPF、またはその他のテクノロジを使用するかどうかにかかわらず、クライアントアプリケーションで、またはASP.NETを使用するサーバーアプリケーションで使用できます。
- MEFは Microsoft.Composition として.NET Coreにも移植されていますが、部分的に移植されています。
- System.Composition のみが移植され、 System.ComponentModel.Composition はまだ使用できません。 つまり、ディレクトリ内のアセンブリから型をロードできるカタログはありません。
この章では、.NET CoreアプリケーションでMEFを使用する方法のみを学習します。
NET CoreコンソールアプリケーションでMEFを使用する簡単な例を理解しましょう。 新しい.NET Coreコンソールプロジェクトを作成しましょう。.
左側のペインで[*テンプレート]→[Visual C#]→[.NET * Core]を選択し、中央のペインで[コンソールアプリケーション(.NET Core)]を選択します。
[名前]フィールドにプロジェクトの名前を入力し、[OK]をクリックします。
プロジェクトが作成されたら、Microsoft.Compositionの参照を追加して、MEFを使用できるようにする必要があります。 そのためには、ソリューションエクスプローラーでプロジェクトを右クリックし、* NuGetパッケージの管理…*
*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 の参照が表示されます。
最初に、エクスポートするインターフェイスを作成し、そのインターフェイスを実装して、エクスポート属性でクラスを修飾する必要があります。 新しいクラスを追加しましょう。
[名前]フィールドにクラスの名前を入力し、[追加]をクリックします。
*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 [[1]]