Trong chương này, chúng ta sẽ thảo luận về Khung 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 ghép nối 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 kỳ 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 hay bất kỳ công nghệ nào khác hay trong các ứng dụng máy chủ sử dụng ASP.NET.
- MEF cũng đã được chuyển dưới dạng Microsoft.Composition sang .NET Core nhưng một phần.
- Chỉ System.Composition được chuyển và System.ComponentModel.Composition chưa khả dụng. Đ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, chọn Mẫu → Visual C# → .NET Core rồi ở 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à nhấp vào OK.
Khi dự án được tạo, chúng ta cần thêm tham chiếu của Microsoft.Composition để chúng ta 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à nhấp vào Cài đặt .
Nhấp vào nút OK
Nhấp vào nút Tôi chấp nhận .
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ở tệp 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"
}
}
}
Bạn có thể thấy rằng phần phụ thuộc Microsoft.Composition đã đượ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ập portablenet45+win8+wp8+wpa81 . Bây giờ chúng ta hãy thay thế tệp project.json của bạn bằng đoạn 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 sửa.
Nếu bạn mở rộng References, thì bạn sẽ thấy một tham chiếu của Microsoft.Composition
Trước tiên, chúng ta cần tạo một giao diện sẽ được xuất và triển khai giao diện và trang trí lớp bằng 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 Thêm .
Hãy để chúng tôi thêm đoạn mã sau vào tệp 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);
}
}
}
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ừ Hội có thuộc tính xuất và gắn vào 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ờ chúng ta hãy 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 lớp PrintData .
Để 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.