Dotnet-core-managed-extensibility-framework

提供:Dev Guides
移動先:案内検索

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

この章では、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 の参照が表示されます。

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 クラスをインスタンス化することで、アプリケーションが実行されていることがわかります。

PrintData

MEFの詳細については、次のURL [[1]]