การใช้ MEF เพื่ออนุญาตให้ผู้ใช้เพิ่มปลั๊กอินที่กำหนดเอง เพื่อเรียกใช้เมธอด และเปลี่ยนแปลงคอลเลกชันของจุดข้อมูล

ฉันมีแอปพลิเคชันที่สร้างขึ้นด้วย Prism และ MEF ฉันมีโมดูลบางตัว (กำหนดไว้ในโซลูชันเดียวกัน) ที่ฉันโหลดและทุกอย่างทำงานได้ดี

อย่างไรก็ตาม ตอนนี้ฉันต้องการอนุญาตให้ผู้ใช้เพิ่มปลั๊กอินของตนเอง (โดยพื้นฐานแล้วปลั๊กอินเหล่านี้ควรเปลี่ยนคอลเลกชันของจุดข้อมูล) - ดังนั้นอีกนัยหนึ่งผู้ใช้สร้างอัลกอริทึม (ปลั๊กอิน) ที่เปลี่ยนจุดข้อมูลเหล่านี้ที่อยู่ภายใน ViewModel

ฉันต้องกำหนด "สัญญา" บางประเภทที่ผู้ใช้ต้องปฏิบัติตามเมื่อสร้างปลั๊กอินใหม่ ฉันจะทำเช่นนี้ได้อย่างไร?

ปลั๊กอินควรเป็น .dll เดียวภายในโฟลเดอร์ /Plugin และควรโหลดขณะรันไทม์ ListView ควรถูกเติมในมุมมองที่มี UserControl สำหรับแต่ละปลั๊กอิน


person Nicholas    schedule 11.11.2016    source แหล่งที่มา


คำตอบ (1)


MEF จะทำให้งานนี้ง่ายและราบรื่นจริงๆ

สำหรับปลั๊กอิน:

  1. สร้างอินเทอร์เฟซสำหรับปลั๊กอินของคุณ ไม่จำเป็นต้องซับซ้อนมากนัก แม้ว่าคุณอาจใช้เพื่อบังคับให้นักพัฒนาเพิ่มคำอธิบายหรือข้อมูลเวอร์ชัน และแน่นอนว่าเป็นวิธีการที่รับคอลเลกชันของคุณและแปลงคอลเลกชันนั้น

  2. ปลั๊กอินควรใช้ ExportAttribute เพื่อแจ้งให้ MEF ทราบเกี่ยวกับปลั๊กอินเหล่านั้น

    [Export(typeof(IPlugin))]
    public class Plugin : IPlugin
    

ก็น่าจะเพียงพอแล้วนี่

สำหรับการสมัคร:

  1. ประกาศคอลเลกชันที่จะได้รับรายการปลั๊กอินที่ MEF สามารถค้นหาได้ อย่าลืม ImportManyAttribute

    [ImportMany(typeof(IPlugin))]
    public IEnumerable<IPlugin> Plugins{ get; set; }
    
  2. สร้างแค็ตตาล็อกและคอนเทนเนอร์ของคุณ ในโค้ดที่ฉันแสดง ฉันได้เพิ่มแค็ตตาล็อกสองรายการ บางทีคุณอาจไม่ต้องการมัน เพียงเพื่อให้คุณรู้ว่าคุณสามารถมีแหล่งที่มามากกว่าหนึ่งแหล่งได้

    AggregateCatalog catalog = new AggregateCatalog();
    catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetEntryAssembly()));
    catalog.Catalogs.Add(new DirectoryCatalog("plugins"));
    var container = new CompositionContainer(catalog);
    
  3. ทำเวทย์มนตร์ แน่นอนว่า this ควรเป็นวัตถุที่มี ImportManyAttribute นั้น

    container.ComposeParts(this);
    
person Paulo Junior    schedule 11.11.2016