Managed Extensibility Framework
ในบทนี้เราจะพูดถึง Managed Extensibility Framework (MEF) MEF สามารถใช้สำหรับความสามารถในการขยายปลั๊กอินของบุคคลที่สามหรือสามารถนำประโยชน์ของสถาปัตยกรรมคล้ายปลั๊กอินที่เชื่อมต่อกันแบบหลวม ๆ มาใช้กับแอปพลิเคชันทั่วไป
MEF เป็นไลบรารีสำหรับสร้างแอปพลิเคชันที่มีน้ำหนักเบาและขยายได้
ช่วยให้นักพัฒนาแอปพลิเคชันสามารถค้นพบและใช้ส่วนขยายได้โดยไม่ต้องกำหนดค่าใด ๆ
MEF เป็นส่วนหนึ่งของ. NET Framework 4 และสามารถใช้ได้ทุกที่ที่ใช้. NET Framework ซึ่งช่วยเพิ่มความยืดหยุ่นความสามารถในการบำรุงรักษาและความสามารถในการทดสอบของแอปพลิเคชันขนาดใหญ่
คุณสามารถใช้ MEF ในแอปพลิเคชันไคลเอนต์ของคุณไม่ว่าจะใช้ Windows Forms, WPF หรือเทคโนโลยีอื่น ๆ หรือในแอปพลิเคชันเซิร์ฟเวอร์ที่ใช้ ASP.NET
MEF ได้รับการแปลงเป็นไฟล์ Microsoft.Composition เป็น. NET Core เช่นกัน แต่บางส่วน
เท่านั้น System.Composition ถูกย้ายและ System.ComponentModel.Compositionยังไม่พร้อมใช้งาน ซึ่งหมายความว่าเราไม่มีแคตตาล็อกที่สามารถโหลดประเภทจากแอสเซมบลีในไดเร็กทอรี
ในบทนี้เราจะเรียนรู้วิธีใช้ MEF ในแอปพลิเคชัน. NET Core เท่านั้น
ให้เราเข้าใจตัวอย่างง่ายๆที่เราจะใช้ MEF ในแอปพลิเคชันคอนโซล. NET Core ให้เราสร้างโปรเจ็กต์คอนโซล. NET Core ใหม่
ในบานหน้าต่างด้านซ้ายเลือก Templates → Visual C# → .NET Core จากนั้นในบานหน้าต่างตรงกลางให้เลือก Console Application (.NET Core)
ป้อนชื่อโครงการในฟิลด์ชื่อและคลิกตกลง
เมื่อสร้างโครงการแล้วเราจำเป็นต้องเพิ่มการอ้างอิงของ Microsoft.Composition เพื่อให้เราสามารถใช้ MEF ได้ ในการทำเช่นนั้นให้เราคลิกขวาที่โครงการใน Solution Explorer และManage NuGet Packages…
ค้นหา Microsoft.Composition แล้วคลิก Install.
คลิก OK ปุ่ม.
คลิก I Accept ปุ่ม.
เมื่อการติดตั้งเสร็จสมบูรณ์คุณจะพบข้อผิดพลาดในการอ้างอิง
ให้เราเปิดไฟล์ 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.
ก่อนอื่นเราต้องสร้างอินเทอร์เฟซที่จะส่งออกและใช้อินเทอร์เฟซและตกแต่งคลาสด้วยแอตทริบิวต์การส่งออก ให้เราเพิ่มคลาสใหม่
ป้อนชื่อชั้นเรียนของคุณในช่องชื่อแล้วคลิก 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 ดังนั้นมันจะโหลดทุกประเภทจากแอสเซมบลีที่มีแอ็ตทริบิวต์เอ็กซ์พอร์ตและแนบไปกับแอ็ตทริบิวต์อิมพอร์ตดังที่แสดงในเมธอด Compose ในไฟล์ 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>();
}
}
}
}
ตอนนี้ให้เราเรียกใช้แอปพลิเคชันของคุณและคุณจะเห็นว่ากำลังทำงานโดยการสร้างอินสแตนซ์ไฟล์ PrintData ชั้นเรียน
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ MEF โปรดไปที่ URL ต่อไปนี้ https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx สำหรับรายละเอียดเพิ่มเติม