Учебники

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

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

Это позволяет разработчикам приложений обнаруживать и использовать расширения без необходимости настройки.

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.

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

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

Имя поля

Как только проект создан, нам нужно добавить ссылку на Microsoft.Composition, чтобы мы могли использовать MEF. Для этого щелкните правой кнопкой мыши проект в Обозревателе решений и выберите Управление пакетами NuGet…

Найдите Microsoft.Composition и нажмите « Установить» .

управлять

Нажмите кнопку ОК .

Нажмите кнопку

Нажмите кнопку Я принимаю .

принимать

Когда установка завершится, вы найдете ошибку в списке литературы.

Ссылки на ошибки

Давайте откроем файл 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. Таким образом, он загрузит все типы из сборки с атрибутом экспорта и присоединит к атрибуту импорта, как показано в методе 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 .

PrintData

Чтобы узнать больше о MEF, посетите наш URL-адрес https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx для получения более подробной информации.