Фреймворк управляемой расширяемости

В этой главе мы обсудим структуру управляемой расширяемости (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пока недоступен. Это означает, что у нас нет каталогов, которые могут загружать типы из сборок в каталоге.

В этой главе мы только узнаем, как мы можем использовать MEF в приложении .NET Core.

Давайте разберемся на простом примере, в котором мы будем использовать MEF в консольном приложении .NET Core. Давайте теперь создадим новый консольный проект .NET Core.

На левой панели выберите Templates → Visual C# → .NET Core, а затем на средней панели выберите Консольное приложение (.NET Core).

Введите название проекта в поле «Имя» и нажмите «ОК».

После создания проекта нам нужно добавить ссылку на Microsoft.Composition, чтобы мы могли использовать MEF. Для этого щелкните правой кнопкой мыши проект в обозревателе решений и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.

Сначала нам нужно создать интерфейс, который нужно экспортировать, реализовать интерфейс и украсить класс атрибутом экспорта. Давайте теперь добавим новый класс.

Введите название вашего класса в поле Имя и нажмите 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. Таким образом, он загрузит все типы из сборки с атрибутом экспорта и присоединится к атрибуту импорта, как показано в методе Compose в файле Program.cs.

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 Больше подробностей.