托管可扩展性框架
托管可扩展性框架
在本章中,我们将讨论托管可扩展性框架 (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 控制台项目。
在左侧窗格中,选择Templates → Visual C# → .NET Core,然后在中间窗格中,选择 Console Application (.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的引用。
首先,我们需要创建一个要导出的接口并实现该接口并使用 export 属性装饰类。现在让我们添加一个新类。
在名称字段中输入您的班级名称,然后单击添加。
让我们在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 的更多信息,请访问以下 URL https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx了解更多详细信息。