Dotnet Core 简明教程
Managed Extensibility Framework
在本章中,我们将讨论可托管扩展框架 (MEF)。MEF 可用于第三方插件扩展,或者它可以为常规应用程序带来松散耦合的插件式架构的优势。
-
MEF 是一个用于创建轻量级、可扩展应用程序的库。
-
它允许应用程序开发人员发现和使用扩展,而无需进行任何配置。
-
MEF 是 .NET Framework 4 的组成部分,并且在所有使用 .NET Framework 的地方都可以使用,这提高了大型应用程序的灵活性、可维护性和可测试性。
-
无论你的客户端应用程序使用的是 Windows 窗体、WPF 还是任何其他技术,还是使用 ASP.NET 的服务器应用程序,你都可以使用 MEF。
-
MEF 已移植为 Microsoft.Composition ,并且也部分移植到了 .NET Core。
-
仅移植了 System.Composition ,而 System.ComponentModel.Composition 尚未可用。这意味着,我们没有可以在目录中从程序集中加载类型的目录。
在本章中,我们将仅了解如何在 .NET Core 应用程序中使用 MEF。
让我们了解一个简单的示例,其中我们将在 .NET Core 控制台应用程序中使用 MEF。现在,让我们创建一个新的 .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 命名空间中不提供目录。因此,它会加载装配中具有导出属性的所有类型,并将它们附加到导入属性中,如 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,让我们访问以下网址 https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx ,了解更多详情。