Programovanie

Ako pracovať s rámcom Managed Extensibility Framework v C #

MEF (Managed Extensibility Framework) je komponent, ktorý sa dodáva s .Net Framework 4 (alebo novším) a pomáha vám vytvárať aplikácie, ktoré sú ľahké a rozšíriteľné prijatím voľne prepojenej architektúry podobnej doplnku. Tento rámec môžete využiť na objavovanie a využívanie rozšírení bez potreby akejkoľvek konfigurácie. Použitím MEF môžete ľahko vylepšiť flexibilitu, udržiavateľnosť a testovateľnosť svojich aplikácií. Pri použití MEF môžete rozšírenia znova použiť v rámci tej istej aplikácie alebo dokonca naprieč aplikáciami.

MSDN uvádza: "Managed Extensibility Framework alebo MEF je knižnica na vytváranie ľahkých a rozšíriteľných aplikácií. Umožňuje vývojárom aplikácií objavovať a používať rozšírenia bez nutnosti akejkoľvek konfigurácie. Umožňuje vývojárom rozšírení ľahko zapuzdriť kód a vyhnúť sa krehkým závislostiam. MEF umožňuje nielen opätovné použitie rozšírení v rámci aplikácií, ale aj medzi nimi. “

DI, IoC a MEF

DI (Dependency Injection) je realizáciou princípu IoC (inverzia riadenia). Uvádza sa v ňom, že ak je objekt závislý na iných objektoch, mali by sa vytvárať pomocou samostatného rámca alebo komponentu. Zatiaľ čo IoC je schopnosť meniť implementáciu zmluvy, DI je schopnosť poskytnúť potrebnú implementáciu, ak je o to požiadaná. Upozorňujeme, že kontajnery IoC by ste mali používať, keď sú vaše závislosti statické - ak sú dynamické, MEF je oveľa užitočnejšie. V zásade DI kontajnery poskytujú podporu pre zloženie objektov, správu životnosti a odpočúvanie.

Na rozdiel od typického kontajnera na vkladanie závislostí, ako je Unity, NInject, Castle Windsor MEF poskytuje podporu iba pre zloženie objektu. MEF vám poskytuje spôsob rozšírenia doplnkov - funkciu, ktorú typické kontajnery IOC nepodporujú.

MEF je spravovaná knižnica, ktorá je súčasťou nedávnych verzií .Net Framework (presnejšie od .Net Framework 4) na objavovanie rozšírení prostredníctvom kompozície bez potreby akejkoľvek konfigurácie. Komponent v MEF je známy ako súčasť. Časť deklaratívne špecifikuje svoje závislosti a schopnosti. Tieto závislosti sú známe ako „importy“ a možnosti sú reprezentované prostredníctvom „exportu“. Upozorňujeme, že časť by mala mať uvedený atribút „Export“.

Začíname

Pri práci s MEF môžete použiť ktorýkoľvek z dvoch prístupov. Patria sem: prístupy založené na atribútoch a konvenciách. Pri použití prvého z nich by ste zvyčajne využili výhody atribútov v kóde. Naopak, v druhom prípade by ste chceli vytvoriť súbor pravidiel a potom určiť platné pravidlá a tie, ktoré sa neuplatňujú. V tomto príklade preskúmame prvý prístup.

MEF vám poskytuje rozšíriteľnosť prostredníctvom zásuvného modulu. Obor názvov System.Composition poskytuje podporu pre MEF v .Net. Ak chcete začať používať MEF vo svojej aplikácii, mali by ste zahrnúť zostavu System.Composition ako odkaz na váš projekt.

Teraz zvážte nasledujúce rozhranie s názvom ILogger uvedené nižšie.

verejné rozhranie ILogger

   {

reťazec Správa {get; sada; }

   }

Nasledujúce triedy FileLogger a DbLogger implementujú rozhranie ILogger.

[Export]

verejná trieda FileLogger: ILogger

   {      

verejný reťazec Správa

       {

pripraviť sa;

       }

   }

[Export]

verejná trieda DbLogger: ILogger

   {

verejný reťazec Správa

       {

dostať; sada;

       }

   }

Na prvý pohľad by ste mohli predpokladať, že MEF je ako DI kontajner. Aj keď MEF vyzerá ako DI kontajner, jeho cieľom je hlavne rozšíriteľnosť. MEF v zásade využíva mechanizmus objavovania založený na atribútoch na podporu rozšíriteľnosti bez potreby konfigurácie komponentov. Nepotrebujete žiadnu registráciu - stačí, keď svoje typy označíte atribútom Export a urobí sa všetko za vás. Na rozdiel od Unity môžete pri používaní MEF svoje triedy iba označiť pomocou atribútov bez potreby ich individuálnej registrácie. Exportované hodnoty sú uložené v kontajneri. Nasledujúca trieda ukazuje, ako môžete vytvoriť vlastný kontajner MEF a uložiť doň všetok export z adresára, kde sa nachádza aktuálne vykonávajúce zostavenie.

verejná statická trieda MEFContainer

   {

súkromný statický CompositionContainer compositionContainer = null;

verejný statický kontajner CompositionContainer

       {

dostať

           {

if (compositionContainer == null)

               {

var adresár katalóg =

nový DirectoryCatalog (

Path.GetDirectoryName (

Assembly.GetExecutingAssembly (). Umiestnenie));

positionContainer = nový CompositionContainer (adresárKatalog);

               }

návratová skladba Kontajner;

           }

       }

   }

Nasledujúci úryvok kódu ilustruje, ako môžete prostredníctvom kontajnera načítať inštanciu typu FileLogger.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue ();

Podobne na získanie inštancie typu DbLogger môžete použiť nasledujúci útržok kódu.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue ();