- .NET Core 教程
- .NET Core - 首页
- .NET Core - 概述
- .NET Core - 先决条件
- .NET Core - 环境设置
- .NET Core - 入门
- .NET Core - 数值计算
- .NET Core - 垃圾回收
- .NET Core - 代码执行
- .NET Core - 模块化
- .NET Core - 项目文件
- .NET Core - 包引用
- 使用 .NET Core 创建 UWP 应用
- .NET Core - MSBuild
- .NET Core - 元包
- Windows 运行时和扩展 SDK
- 创建 .NET Standard 库
- .NET Core - 可移植类库
- 向库添加引用
- 共享 .NET Core 库
- 创建 Xamarin.Forms 项目
- .NET Core - PCL 故障排除
- .NET Core - 创建测试项目
- 在 Visual Studio 中运行测试
- .NET Core - 测试库
- 托管可扩展性框架
- .NET Core - SDK
- .NET Core - MSBuild 和 project.json
- 还原和构建以及 MSBuild
- .NET Core - 迁移
- .NET Core 有用资源
- .NET Core - 快速指南
- .NET Core - 有用资源
- .NET Core - 讨论
托管可扩展性框架
本章将讨论托管可扩展性框架 (MEF)。MEF 可用于第三方插件扩展,也可以为常规应用程序带来松散耦合插件式架构的优势。
MEF 是一个用于创建轻量级、可扩展应用程序的库。
它允许应用程序开发人员发现和使用扩展,无需任何配置。
MEF 是 .NET Framework 4 的一个组成部分,并且可在使用 .NET Framework 的任何地方使用,从而提高大型应用程序的灵活性和可维护性以及可测试性。
您可以在客户端应用程序中使用 MEF,无论它们使用的是 Windows 窗体、WPF 还是任何其他技术,或者在使用 ASP.NET 的服务器应用程序中使用。
MEF 也已作为 **Microsoft.Composition** 移植到 .NET Core,但只是部分移植。
只有 **System.Composition** 被移植,而 **System.ComponentModel.Composition** 尚未可用。这意味着我们没有可以从目录中的程序集加载类型的目录。
本章我们只学习如何在 .NET Core 应用程序中使用 MEF。
让我们理解一个简单的例子,在这个例子中,我们将在 .NET Core 控制台应用程序中使用 MEF。现在让我们创建一个新的 .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 命名空间中没有目录。因此,它将加载程序集中所有带有导出属性的类型,并像 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 获取更多详细信息。