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