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