Programiranje

Kako delati z upravljanim okvirom razširljivosti v C #

MEF (Managed Extensibility Framework) je komponenta, ki je priložena .Net Framework 4 (ali novejši različici) in vam pomaga pri izdelavi lahkih in razširljivih programov s sprejetjem ohlapno povezane arhitekture vtičnikov. Ta okvir lahko izkoristite za odkrivanje in izkoriščanje razširitev brez potrebe po kakršni koli konfiguraciji. Z uporabo MEF lahko z lahkoto izboljšate prilagodljivost, vzdržnost in preizkusnost svojih aplikacij. Ko uporabljate MEF, lahko razširitve znova uporabite v isti aplikaciji ali celo med aplikacijami.

MSDN pravi: "Upravljani okvir razširljivosti ali MEF je knjižnica za ustvarjanje lahkih, razširljivih aplikacij. Razvijalcem aplikacij omogoča odkrivanje in uporabo razširitev brez potrebne konfiguracije. Razvijalcem razširitev omogoča tudi enostavno vključitev kode in izogibanje krhkim trdim odvisnostim. MEF ne omogoča samo ponovne uporabe razširitev znotraj aplikacij, temveč tudi med aplikacijami. "

DI, IoC in MEF

DI (Dependency Injection) je uresničitev načela IoC (Inverzija nadzora). Navaja, da je treba, kadar je objekt odvisen od drugih predmetov, take predmete ustvariti z uporabo ločenega ogrodja ali komponente. Medtem ko je IoC zmožnost spreminjanja izvajanja pogodbe, je DI zmožnost zagotavljanja potrebne izvedbe, ko se za to zahteva. Upoštevajte, da bi morali uporabiti vsebnike IoC, kadar so vaše odvisnosti statične - če so dinamične, je MEF veliko bolj uporaben. V bistvu vsebniki DI zagotavljajo podporo za sestavo predmetov, upravljanje življenjske dobe in prestrezanje.

V nasprotju s tipičnim vsebnikom za vbrizgavanje odvisnosti, kot je Unity, NInject, Castle Windsor MEF nudi podporo samo za sestavo predmetov. MEF vam omogoča razširitev vtičnikov - značilnost, ki je tipični vsebniki IOC ne podpirajo.

MEF je upravljana knjižnica, ki je vključena kot del najnovejših različic .Net Framework (natančneje od .Net Framework 4) za odkrivanje razširitev skozi sestavo brez kakršne koli konfiguracije. Komponenta v MEF je znana kot del. Del natančno določi svoje odvisnosti in zmogljivosti. Te odvisnosti so znane kot "Uvoz", zmogljivosti pa so predstavljene prek "Izvoza". Upoštevajte, da mora imeti del omenjen atribut »Export«.

Kako začeti

Pri delu z MEF lahko uporabite katerega koli od obeh pristopov. Sem spadajo: pristopi, ki temeljijo na atributih in konvencijah. Ko uporabljate prvega, običajno izkoristite atribute v svoji kodi. Nasprotno, v slednjem bi želeli ustvariti nabor pravil in nato določiti pravila, ki veljajo in tista pravila, ki ne veljajo. V tem primeru bomo raziskali prvi pristop.

MEF vam omogoča razširljivost s pomočjo vtičnika. Imenski prostor System.Composition nudi podporo za MEF v .Net. Če želite začeti uporabljati MEF v svoji aplikaciji, vključite sklop System.Composition kot sklic na svoj projekt.

Zdaj upoštevajte spodnji vmesnik z imenom ILogger.

javni vmesnik ILogger

   {

niz Sporočilo {get; set; }

   }

Naslednja razreda FileLogger in DbLogger izvajata vmesnik ILogger.

[Izvozi]

javni razred FileLogger: ILogger

   {      

javni niz Sporočilo

       {

pripravi se;

       }

   }

[Izvozi]

javni razred DbLogger: ILogger

   {

javni niz Sporočilo

       {

dobili; set;

       }

   }

Na prvi pogled lahko domnevate, da je MEF kot DI posoda. Čeprav je MEF videti kot DI vsebnik, je njegov cilj predvsem razširljivost. V bistvu MEF izkorišča mehanizem odkrivanja na osnovi atributov za spodbujanje razširljivosti brez potrebe po konfiguraciji komponent. Ne potrebujete nobene registracije - svoje vrste morate samo označiti z atributom Export in to stori vse namesto vas. Za razliko od Unity lahko pri uporabi MEF svoje razrede samo označite z atributi, ne da bi jih bilo treba posebej registrirati. Vse izvožene vrednosti so shranjene v vsebniku. Naslednji razred prikazuje, kako lahko zgradite vsebnik MEF po meri in v njem shranite ves izvoz iz imenika, v katerem je trenutni izvršilni sklop.

javni statični razred MEFContainer

   {

zasebni statični CompositionContainer sastavContainer = null;

javni statični vsebnik CompositionContainer

       {

dobili

           {

če (stavekContainer == null)

               {

var directoryCatalog =

new DirectoryCatalog (

Path.GetDirectoryName (

Assembly.GetExecutingAssembly (). Lokacija));

compositionContainer = nov CompositionContainer (directoryCatalog);

               }

povratna sestavaContainer;

           }

       }

   }

Naslednji delček kode prikazuje, kako lahko prek vsebnika pridobite primerek tipa FileLogger.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue ();

Podobno lahko za pridobitev primerka tipa DbLogger uporabite naslednji delček kode.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue ();

$config[zx-auto] not found$config[zx-overlay] not found