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 สำหรับรายละเอียดเพิ่มเติม