Kako raditi s Okvirom upravljane proširivosti u C #

MEF (Managed Extensibility Framework) komponenta je koja dolazi s .Net Framework 4 (ili novijom verzijom) i pomaže vam u izradi laganih i proširivih aplikacija usvajanjem labavo povezane arhitekture nalik dodacima. Možete iskoristiti ovaj okvir za otkrivanje i iskorištavanje proširenja bez potrebe za bilo kojom konfiguracijom. Korištenjem MEF-a s lakoćom možete poboljšati fleksibilnost, održivost i provjerljivost svojih aplikacija. Kada upotrebljavate MEF, možete ponovo koristiti proširenja unutar iste aplikacije ili, čak i među njima.

MSDN navodi: "Upravljani okvir proširivosti ili MEF je knjižnica za stvaranje laganih, proširivih aplikacija. Programerima aplikacija omogućuje otkrivanje i korištenje proširenja bez potrebne konfiguracije. Također omogućuje programerima proširenja da lako enkapsuliraju kôd i izbjegnu krhke tvrde ovisnosti. MEF ne samo da omogućuje ponovnu upotrebu proširenja unutar aplikacija, već i među njima. "

DI, IoC i MEF

DI (ubrizgavanje ovisnosti) je ostvarenje IoC (Inverzija upravljanja) principa. U njemu se navodi da kada je objekt ovisan o drugim objektima, takvi bi se objekti trebali stvoriti pomoću zasebnog okvira ili komponente. Iako je IoC sposobnost mijenjanja provedbe ugovora, DI je sposobnost pružanja potrebne provedbe kada se to zatraži. Imajte na umu da biste trebali koristiti IoC spremnike kada su vaše ovisnosti statične - ako su dinamične, MEF je puno korisniji. U osnovi, DI spremnici pružaju podršku za sastav objekta, životno upravljanje i presretanje.

Suprotno tipičnom spremniku za ubrizgavanje ovisnosti poput Unity, NInject, Castle Windsor MEF pruža podršku samo za sastav objekta. MEF vam pruža način za proširenje dodataka - značajku za koju tipični IOC spremnici ne pružaju podršku.

MEF je upravljana knjižnica koja je uključena kao dio novijih verzija .Net Framework-a (točnije od .Net Framework-a 4) za otkrivanje proširenja kroz sastav bez potrebe za bilo kakvom konfiguracijom. Komponenta u MEF-u poznata je kao dio. Dio specificira svoje ovisnosti i mogućnosti deklarativno. Te su ovisnosti poznate pod nazivom "Uvoz", a mogućnosti su predstavljene putem "Izvoza". Imajte na umu da bi dio trebao imati spomenuti atribut "Export".

Početak rada

Kada radite s MEF-om, možete koristiti bilo koji od dva pristupa. Oni uključuju: pristupe koji se temelje na atributima i konvencijama. Kada upotrebljavate prvi, obično biste iskoristili prednosti atributa na svom kodu. Naprotiv, u potonjem biste željeli stvoriti skup pravila, a zatim odrediti pravila koja se primjenjuju i ona pravila koja se ne primjenjuju. U ovom ćemo primjeru istražiti prvi pristup.

MEF vam pruža proširivost putem plug-in okvira. Prostor imena System.Composition pruža podršku za MEF u .Net. Da biste započeli s korištenjem MEF-a u svojoj aplikaciji, trebali biste uključiti sklop System.Composition kao referencu na svoj projekt.

Sada razmotrite sljedeće sučelje nazvano ILogger dano u nastavku.

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;

       }

   }

Na prvi pogled možete pretpostaviti da je MEF poput DI spremnika. Međutim, iako MEF izgleda kao DI spremnik, uglavnom mu je cilj proširivost. U osnovi, MEF koristi prednost mehanizma otkrivanja temeljenog na atributima za promicanje proširivosti bez potrebe za konfiguriranjem komponenata. Ne trebate nikakvu registraciju - samo trebate označiti svoje vrste atributom Export i to sve čini za vas. Za razliku od Unityja, kada koristite MEF, možete jednostavno označavati svoje predmete pomoću atributa bez potrebe da ih pojedinačno registrirate. Sve izvezene vrijednosti pohranjene su u spremniku. Sljedeća klasa pokazuje kako možete izraditi prilagođeni MEF spremnik i u njega pohraniti sav izvoz iz direktorija u kojem se nalazi trenutni izvršni sklop.

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;

           }

       }

   }

Sljedeći isječak koda ilustrira kako možete dohvatiti instancu tipa FileLogger putem spremnika.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue();

Slično tome, za dohvaćanje instance tipa DbLogger možete upotrijebiti sljedeći isječak koda.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue();