Khung khả năng mở rộng được quản lý

Trong chương này, chúng ta sẽ thảo luận về Khung khả năng mở rộng được quản lý (MEF). MEF có thể được sử dụng cho khả năng mở rộng plugin của bên thứ ba hoặc nó có thể mang lại lợi ích của kiến ​​trúc giống như plugin được kết hợp lỏng lẻo cho các ứng dụng thông thường.

  • MEF là một thư viện để tạo các ứng dụng nhẹ, có thể mở rộng.

  • Nó cho phép các nhà phát triển ứng dụng khám phá và sử dụng các tiện ích mở rộng mà không cần cấu hình.

  • MEF là một phần không thể thiếu của .NET Framework 4 và có sẵn ở bất cứ nơi nào .NET Framework được sử dụng để cải thiện tính linh hoạt, khả năng bảo trì và khả năng kiểm tra của các ứng dụng lớn.

  • Bạn có thể sử dụng MEF trong các ứng dụng khách của mình, cho dù chúng sử dụng Windows Forms, WPF hoặc bất kỳ công nghệ nào khác hoặc trong các ứng dụng máy chủ sử dụng ASP.NET.

  • MEF đã được chuyển thành Microsoft.Composition .NET Core cũng như một phần.

  • Chỉ có System.Composition được chuyển, và System.ComponentModel.Compositionvẫn chưa có sẵn. Điều này có nghĩa là, chúng tôi không có danh mục có thể tải các loại từ các tập hợp trong một thư mục.

Trong chương này, chúng ta sẽ chỉ tìm hiểu cách sử dụng MEF trong ứng dụng .NET Core.

Hãy để chúng tôi hiểu một ví dụ đơn giản trong đó chúng tôi sẽ sử dụng MEF trong ứng dụng bảng điều khiển .NET Core. Bây giờ chúng ta hãy tạo một dự án bảng điều khiển .NET Core mới.

Trong ngăn bên trái, hãy chọn Templates → Visual C# → .NET Core và sau đó trong ngăn giữa, chọn Ứng dụng bảng điều khiển (.NET Core).

Nhập tên của dự án vào trường Tên và bấm OK.

Sau khi dự án được tạo, chúng ta cần thêm tham chiếu của Microsoft.Composition để có thể sử dụng MEF. Để làm như vậy, chúng ta hãy nhấp chuột phải vào dự án trong Solution Explorer vàManage NuGet Packages…

Tìm kiếm Microsoft.Composition và bấm vào Install.

Nhấn vào OK cái nút.

Nhấn vào I Accept cái nút.

Khi quá trình cài đặt hoàn tất, bạn sẽ tìm thấy lỗi trong Tài liệu tham khảo.

Hãy để chúng tôi mở project.json tập tin.

{ 
   "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" 
      } 
   } 
}

Bạn có thể thấy rằng Microsoft.Composition phụ thuộc được thêm vào, nhưng vấn đề là gói này không tương thích với dnxcore50. Vì vậy, chúng tôi cần nhậpportablenet45+win8+wp8+wpa81. Hãy để chúng tôi thay thế bạnproject.json tệp với mã sau.

{ 
   "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" 
      } 
   } 
}

Lưu tệp này và bạn sẽ thấy rằng lỗi đã được khắc phục.

Nếu bạn mở rộng Tham chiếu, thì bạn sẽ thấy một tham chiếu của Microsoft.Composition.

Đầu tiên, chúng ta cần tạo một giao diện sẽ được xuất và thực hiện giao diện và trang trí lớp với thuộc tính xuất. Bây giờ chúng ta hãy thêm một lớp mới.

Nhập tên cho lớp của bạn vào trường Tên và nhấp vào Add.

Hãy để chúng tôi thêm mã sau vào PrintData.cs tập tin.

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); 
      } 
   } 
}

Như đã đề cập ở trên, Danh mục không có sẵn trong không gian tên Microsoft.Composition. Vì vậy, nó sẽ tải tất cả các loại từ Assembly với thuộc tính xuất và đính kèm với thuộc tính nhập như được hiển thị trong phương thức Soạn trong tệp 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>(); 
         } 
      } 
   } 
}

Bây giờ, hãy để chúng tôi chạy ứng dụng của bạn và bạn sẽ thấy rằng nó đang chạy bằng cách khởi tạo PrintData lớp học.

Để tìm hiểu thêm về MEF, chúng ta hãy truy cập Url sau https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx để biết thêm chi tiết.