Cara bekerjasama dengan Kerangka Keterpanjangan Terurus di C #

MEF (Managed Extensibility Framework) adalah komponen yang disertakan dengan .Net Framework 4 (atau seterusnya) dan membantu anda membina aplikasi yang ringan dan dapat diperluas dengan mengadopsi seni bina seperti plugin yang longgar. Anda dapat memanfaatkan kerangka ini untuk mencari dan memanfaatkan sambungan tanpa memerlukan konfigurasi apa pun. Dengan menggunakan MEF, anda dapat meningkatkan fleksibiliti, kebolehlanjutan dan kebolehujian aplikasi anda dengan mudah. Semasa menggunakan MEF, anda dapat menggunakan kembali peluasan dalam aplikasi yang sama atau, bahkan di seluruh aplikasi.

MSDN menyatakan: "The Managed Extensibility Framework atau MEF adalah perpustakaan untuk membuat aplikasi ringan dan dapat diperluas. Ia membolehkan pembangun aplikasi menemui dan menggunakan peluasan tanpa konfigurasi yang diperlukan. Ia juga membolehkan pembangun sambungan dengan mudah merangkum kod dan mengelakkan pergantungan keras yang rapuh. MEF tidak hanya membolehkan peluasan digunakan kembali dalam aplikasi, tetapi juga di seluruh aplikasi. "

DI, IoC, dan MEF

DI (Dependency Injection) adalah merealisasikan prinsip IoC (Inversion of Control). Ia menyatakan bahawa apabila suatu objek bergantung pada objek lain, objek tersebut harus dibuat menggunakan kerangka atau komponen yang terpisah. Walaupun IoC adalah kemampuan memvariasikan pelaksanaan kontrak, DI adalah kemampuan untuk menyediakan pelaksanaan yang diperlukan ketika diminta. Perhatikan bahawa anda harus menggunakan bekas IoC ketika kebergantungan anda statik - jika dinamik, MEF jauh lebih berguna. Pada dasarnya, kontena DI memberikan sokongan untuk Komposisi Objek, Pengurusan Sepanjang Hayat, dan Pemintasan.

Berbeza dengan bekas suntikan kebergantungan seperti Unity, NInject, Castle Windsor MEF memberikan sokongan untuk komposisi objek sahaja. MEF memberi anda cara untuk memperluaskan pemalam - ciri yang tidak disokong oleh bekas khas IOC.

MEF adalah perpustakaan terurus yang disertakan sebagai sebahagian daripada versi terbaru .Net Framework (sejak .Net Framework 4 menjadi lebih tepat) untuk menemui peluasan melalui komposisi tanpa memerlukan konfigurasi apa pun. Komponen dalam MEF dikenali sebagai bahagian. Sebahagian menentukan kebergantungan dan kemampuannya secara deklaratif. Pergantungan ini dikenal sebagai "Import" dan kemampuannya ditunjukkan melalui "Eksport". Perhatikan bahawa bahagian harus memiliki atribut "Eksport" yang disebutkan.

Bermula

Semasa bekerja dengan MEF, anda boleh menggunakan salah satu daripada dua pendekatan tersebut. Ini merangkumi: pendekatan berdasarkan atribut dan berasaskan konvensyen. Semasa menggunakan yang pertama, anda biasanya akan memanfaatkan atribut pada kod anda. Sebaliknya, pada yang terakhir anda ingin membuat satu set peraturan dan kemudian menentukan peraturan yang berlaku dan peraturan yang tidak berlaku. Dalam contoh ini kita akan meneroka pendekatan pertama.

MEF memberi anda kepanjangan melalui kerangka pemalam. Ruang nama System.Composition memberikan sokongan untuk MEF di .Net. Untuk mula menggunakan MEF dalam aplikasi anda, anda harus memasukkan pemasangan System.Composition sebagai rujukan projek anda.

Sekarang, pertimbangkan antara muka berikut bernama ILogger yang diberikan di bawah.

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;

       }

   }

Pada pandangan pertama anda mungkin menganggap bahawa MEF adalah seperti bekas DI. Walau bagaimanapun, walaupun MEF kelihatan seperti kontena DI, ia terutama bertujuan untuk memperluas. Pada hakikatnya, MEF memanfaatkan mekanisme penemuan berdasarkan atribut untuk mempromosikan kepanjangan tanpa perlu mengkonfigurasi komponen. Anda tidak memerlukan pendaftaran - anda hanya perlu menandai jenis anda dengan atribut Eksport dan semuanya sesuai untuk anda. Tidak seperti Unity, semasa menggunakan MEF, anda boleh menandakan kelas anda menggunakan atribut tanpa perlu mendaftarkannya secara individu. Semua nilai yang dieksport disimpan dalam bekas. Kelas berikut menunjukkan bagaimana anda boleh membina wadah MEF tersuai dan menyimpan di dalamnya semua eksport dari direktori di mana kumpulan pelaksana semasa 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;

           }

       }

   }

Coretan kod berikut menggambarkan bagaimana anda dapat mengambil contoh jenis FileLogger melalui bekas.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue();

Begitu juga, untuk mendapatkan contoh jenis DbLogger, anda boleh menggunakan coretan kod berikut.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue();