Cara bekerja dengan Kerangka Kerja Ekstensi yang Dikelola di C #

MEF (Managed Extensibility Framework) adalah komponen yang disertakan dengan .Net Framework 4 (atau lebih tinggi) dan membantu Anda membangun aplikasi yang ringan dan dapat diperluas dengan mengadopsi arsitektur seperti plugin yang digabungkan secara longgar. Anda dapat memanfaatkan kerangka kerja ini untuk menemukan dan memanfaatkan ekstensi tanpa memerlukan konfigurasi apa pun. Dalam menggunakan MEF, Anda dapat meningkatkan fleksibilitas, pemeliharaan, dan kemampuan pengujian aplikasi Anda dengan mudah. Saat menggunakan MEF, Anda dapat menggunakan kembali ekstensi dalam aplikasi yang sama atau, bahkan di seluruh aplikasi.

MSDN menyatakan: "The Managed Extensibility Framework atau MEF adalah pustaka untuk membuat aplikasi yang ringan dan dapat diperluas. Ini memungkinkan pengembang aplikasi untuk menemukan dan menggunakan ekstensi tanpa perlu konfigurasi. Ini juga memungkinkan pengembang ekstensi dengan mudah merangkum kode dan menghindari ketergantungan keras yang rapuh. MEF tidak hanya memungkinkan ekstensi untuk digunakan kembali dalam aplikasi, tetapi juga di seluruh aplikasi. "

DI, IoC, dan MEF

DI (Dependency Injection) merupakan realisasi dari prinsip IoC (Inversion of Control). Ini menyatakan bahwa ketika sebuah objek bergantung pada objek lain, objek tersebut harus dibuat menggunakan kerangka kerja atau komponen terpisah. Sementara IoC adalah kemampuan untuk memvariasikan implementasi kontrak, DI adalah kemampuan untuk menyediakan implementasi yang diperlukan ketika diminta. Perhatikan bahwa Anda harus menggunakan kontainer IoC ketika dependensi Anda statis - jika mereka dinamis, MEF jauh lebih berguna. Pada dasarnya, kontainer DI memberikan dukungan untuk Komposisi Objek, Manajemen Lifetime, dan Interception.

Berlawanan dengan container injeksi dependensi tipikal seperti Unity, NInject, Castle Windsor MEF menyediakan dukungan untuk komposisi objek saja. MEF memberi Anda cara untuk memperluas plug-in - fitur yang tidak didukung oleh container IOC biasa.

MEF adalah pustaka terkelola yang disertakan sebagai bagian dari versi terbaru .Net Framework (sejak .Net Framework 4 lebih tepatnya) untuk menemukan ekstensi melalui komposisi tanpa memerlukan konfigurasi apa pun. Komponen dalam MEF dikenal sebagai bagian. Bagian menentukan dependensi dan kemampuannya secara deklaratif. Dependensi ini dikenal sebagai "Impor" dan kemampuannya direpresentasikan melalui "Ekspor". Perhatikan bahwa bagian harus memiliki atribut "Ekspor" yang disebutkan.

Mulai

Saat bekerja dengan MEF, Anda dapat menggunakan salah satu dari dua pendekatan. Ini termasuk: pendekatan berbasis atribut dan berbasis konvensi. Saat menggunakan yang pertama, Anda biasanya memanfaatkan atribut pada kode Anda. Sebaliknya, pada metode terakhir Anda ingin membuat sekumpulan aturan dan kemudian menentukan aturan yang berlaku dan aturan yang tidak berlaku. Dalam contoh ini kita akan mengeksplorasi pendekatan pertama.

MEF memberi Anda ekstensibilitas melalui kerangka kerja plug-in. Ruang nama System.Composition menyediakan dukungan untuk MEF di .Net. Untuk mulai menggunakan MEF di aplikasi Anda, Anda harus menyertakan perakitan System.Composition sebagai referensi untuk proyek Anda.

Sekarang, pertimbangkan antarmuka berikut bernama ILogger yang diberikan di bawah ini.

public interface ILogger

   {

       string Message { get; set; }

   }

The following classes FileLogger and DbLogger implement the ILogger interface.

[Export]

   public class FileLogger : ILogger

   {      

       public string Message

       {

           get;set;

       }

   }

[Export]

   public class DbLogger : ILogger

   {

       public string Message

       {

           get; set;

       }

   }

Sekilas Anda mungkin berasumsi bahwa MEF seperti wadah DI. Namun, meskipun MEF terlihat seperti wadah DI, ini terutama bertujuan untuk dapat diperpanjang. Intinya, MEF mengambil keuntungan dari mekanisme penemuan berbasis atribut untuk mempromosikan ekstensibilitas tanpa perlu mengkonfigurasi komponen. Anda tidak memerlukan pendaftaran apa pun - Anda hanya perlu menandai tipe Anda dengan atribut Export dan semuanya untuk Anda. Tidak seperti Unity, saat menggunakan MEF, Anda dapat menandai kelas Anda menggunakan atribut tanpa perlu mendaftarkannya satu per satu. Semua nilai yang diekspor disimpan dalam wadah. Kelas berikut menunjukkan bagaimana Anda dapat membangun wadah MEF kustom dan menyimpan di dalamnya semua ekspor dari direktori tempat perakitan pelaksana saat ini berada.

public static class MEFContainer

   {

       private static CompositionContainer compositionContainer = null;

       public static CompositionContainer Container

       {

           get

           {

               if (compositionContainer == null)

               {

                   var directoryCatalog =

                        new DirectoryCatalog(

                       Path.GetDirectoryName(

                       Assembly.GetExecutingAssembly().Location));

                   compositionContainer = new CompositionContainer(directoryCatalog);

               }

               return compositionContainer;

           }

       }

   }

Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat mengambil instance berjenis FileLogger melalui penampung.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue();

Demikian pula, untuk mengambil instance tipe DbLogger, Anda dapat menggunakan cuplikan kode berikut.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue();