Dotnet Core 简明教程

Managed Extensibility Framework

在本章中,我们将讨论可托管扩展框架 (MEF)。MEF 可用于第三方插件扩展,或者它可以为常规应用程序带来松散耦合的插件式架构的优势。

  1. MEF 是一个用于创建轻量级、可扩展应用程序的库。

  2. 它允许应用程序开发人员发现和使用扩展,而无需进行任何配置。

  3. MEF 是 .NET Framework 4 的组成部分,并且在所有使用 .NET Framework 的地方都可以使用,这提高了大型应用程序的灵活性、可维护性和可测试性。

  4. 无论你的客户端应用程序使用的是 Windows 窗体、WPF 还是任何其他技术,还是使用 ASP.NET 的服务器应用程序,你都可以使用 MEF。

  5. MEF 已移植为 Microsoft.Composition ,并且也部分移植到了 .NET Core。

  6. 仅移植了 System.Composition ,而 System.ComponentModel.Composition 尚未可用。这意味着,我们没有可以在目录中从程序集中加载类型的目录。

在本章中,我们将仅了解如何在 .NET Core 应用程序中使用 MEF。

让我们了解一个简单的示例,其中我们将在 .NET Core 控制台应用程序中使用 MEF。现在,让我们创建一个新的 .NET Core 控制台项目。

在左窗格中,选择 Templates → Visual C# → .NET Core,然后在中间窗格中,选择控制台应用程序 (.NET Core)。

在名称字段中输入项目的名称,然后单击确定。

name field

创建项目后,我们需要添加对 Microsoft.Composition 的引用,以便我们能够使用 MEF。为此,让我们在解决方案资源管理器中右键单击该项目并 Manage NuGet Packages…

搜索 Microsoft.Composition ,然后单击 Install

manage

单击 OK 按钮。

click the button

单击 I Accept 按钮。

accept

当安装完成后,您将在“引用”中发现一个错误。

error references

让我们打开 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"
      }
   }
}

保存此文件,您将看到该错误已纠正。

rectified

如果您展开“引用”,就会看到 Microsoft.Composition 的一个引用。

microsoft composition

首先,我们需要创建一个要导出的接口,然后实现该接口并将该类装饰为导出属性。现在,让我们添加一个新类。

在“名称”字段中输入您类的名称,然后单击 Add

click 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 类来运行。

printdata

要详细了解 MEF,让我们访问以下网址 https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx ,了解更多详情。