Menggunakan MEF untuk memungkinkan pengguna menambahkan plugin khusus, menjalankan metode, dan mengubah kumpulan titik data

Saya memiliki aplikasi yang dibangun dengan Prism dan MEF. Saya memiliki beberapa modul (didefinisikan di dalam solusi yang sama) yang saya muat dan semuanya berfungsi dengan baik.

Namun sekarang saya ingin mengizinkan pengguna untuk menambahkan plugin mereka sendiri (pada dasarnya plugin ini harus mengubah kumpulan titik data) - jadi dengan kata lain pengguna membuat algoritme (plugin) yang mengubah titik data yang ada di dalam ViewModel.

Saya perlu mendefinisikan semacam "Kontrak" yang harus dipertahankan pengguna saat membuat plugin baru. Bagaimana saya melakukan ini?

Plugin harus berupa .dll tunggal di dalam folder /Plugin dan harus dimuat saat runtime, ListView harus diisi dalam tampilan yang berisi UserControl untuk setiap Plugin.


person Nicholas    schedule 11.11.2016    source sumber


Jawaban (1)


MEF akan membuat pekerjaan ini sangat mudah dan lancar.

Untuk plugin:

  1. Buat antarmuka untuk plugin Anda. Ini tidak perlu terlalu rumit, meskipun Anda mungkin menggunakannya untuk memaksa pengembang menambahkan beberapa deskripsi atau informasi versi, dan tentu saja metode yang menerima koleksi Anda dan mengubahnya.

  2. Plugin harus menggunakan EksporAttribute untuk memberi tahu MEF tentangnya.

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

Itu seharusnya sudah cukup di sini.

Untuk aplikasi:

  1. Deklarasikan koleksi yang akan menerima daftar plugin yang dapat ditemukan MEF, jangan lupa ImportManyAttribute.

    [ImportMany(typeof(IPlugin))]
    public IEnumerable<IPlugin> Plugins{ get; set; }
    
  2. Buat katalog dan wadah Anda. Pada kode yang saya tunjukkan saya menambahkan dua katalog, mungkin Anda tidak memerlukannya, asal tahu saja Anda dapat memiliki lebih dari satu sumber.

    AggregateCatalog catalog = new AggregateCatalog();
    catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetEntryAssembly()));
    catalog.Catalogs.Add(new DirectoryCatalog("plugins"));
    var container = new CompositionContainer(catalog);
    
  3. Lakukan keajaiban. Tentu saja this harus menjadi objek dengan ImportManyAttribute itu.

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