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

この章では、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 詳細については。