Programování

Jak pracovat s Managed Extensibility Framework v C #

MEF (Managed Extensibility Framework) je komponenta, která je dodávána s .Net Framework 4 (nebo novějšími) a pomáhá vám vytvářet aplikace, které jsou lehké a rozšiřitelné, přijetím volně propojené architektury podobné pluginu. Tento rámec můžete využít k objevování a využívání rozšíření bez nutnosti jakékoli konfigurace. Při používání MEF můžete snadno zlepšit flexibilitu, udržovatelnost a testovatelnost svých aplikací. Při použití MEF můžete rozšíření znovu použít ve stejné aplikaci nebo dokonce napříč aplikacemi.

MSDN uvádí: "Managed Extensibility Framework nebo MEF je knihovna pro vytváření odlehčených, rozšiřitelných aplikací. Umožňuje vývojářům aplikací objevovat a používat rozšíření bez nutnosti konfigurace. Umožňuje také vývojářům rozšíření snadno zapouzdřit kód a vyhnout se křehkým závislostem. MEF umožňuje nejen opakované použití rozšíření v rámci aplikací, ale také napříč aplikacemi. “

DI, IoC a MEF

DI (Dependency Injection) je realizací principu IoC (inverze řízení). Uvádí, že když je objekt závislý na jiných objektech, měly by být takové objekty vytvořeny pomocí samostatného rámce nebo komponenty. Zatímco IoC je schopnost měnit implementaci smlouvy, DI je schopnost poskytnout na požádání nezbytnou implementaci. Všimněte si, že byste měli používat kontejnery IoC, když jsou vaše závislosti statické - pokud jsou dynamické, MEF je mnohem užitečnější. V zásadě DI kontejnery poskytují podporu pro složení objektu, správu doživotní správy a odposlech.

Na rozdíl od typického kontejneru pro vkládání závislostí, jako je Unity, NInject, Castle Windsor MEF poskytuje podporu pouze pro složení objektu. MEF vám poskytuje způsob, jak rozšířit zásuvné moduly - funkce, pro kterou typické kontejnery IOC neposkytují podporu.

MEF je spravovaná knihovna zahrnutá jako součást nedávných verzí .Net Framework (od přesnějšího .Net Framework 4) k objevování rozšíření prostřednictvím kompozice bez nutnosti jakékoli konfigurace. Složka v MEF je známá jako součást. Část specifikuje své závislosti a schopnosti deklarativně. Tyto závislosti se nazývají „Importy“ a možnosti jsou reprezentovány prostřednictvím „Exportů“. U součásti by měl být uveden atribut „Export“.

Začínáme

Při práci s MEF můžete použít kterýkoli ze dvou přístupů. Patří mezi ně: přístupy založené na atributech a konvencích. Když používáte první, obvykle byste využili výhody atributů ve vašem kódu. Naopak, v druhém případě byste chtěli vytvořit sadu pravidel a poté určit pravidla, která platí, a pravidla, která se nepoužijí. V tomto příkladu prozkoumáme první přístup.

MEF vám poskytuje rozšiřitelnost prostřednictvím zásuvného modulu. Obor názvů System.Composition poskytuje podporu pro MEF v .Net. Chcete-li ve své aplikaci začít používat MEF, měli byste zahrnout sestavu System.Composition jako odkaz na váš projekt.

Nyní zvažte následující rozhraní s názvem ILogger uvedené níže.

veřejné rozhraní ILogger

   {

řetězec Zpráva {get; soubor; }

   }

Následující třídy FileLogger a DbLogger implementují rozhraní ILogger.

[Vývozní]

veřejná třída FileLogger: ILogger

   {      

veřejný řetězec Zpráva

       {

dostat; nastavit;

       }

   }

[Vývozní]

veřejná třída DbLogger: ILogger

   {

veřejný řetězec Zpráva

       {

dostat; soubor;

       }

   }

Na první pohled můžete předpokládat, že MEF je jako DI kontejner. Přestože MEF vypadá jako DI kontejner, jeho cílem je hlavně rozšiřitelnost. V podstatě MEF využívá mechanismus zjišťování založený na atributech k podpoře rozšiřitelnosti bez nutnosti konfigurace komponent. Nepotřebujete žádnou registraci - stačí označit vaše typy atributem Export a vše za vás. Na rozdíl od Unity můžete při používání MEF jednoduše označit své třídy pomocí atributů, aniž byste je museli jednotlivě registrovat. Exportované hodnoty jsou všechny uloženy v kontejneru. Následující třída ukazuje, jak můžete vytvořit vlastní kontejner MEF a uložit do něj všechny exporty z adresáře, kde se nachází aktuální provádějící sestavení.

veřejná statická třída MEFContainer

   {

soukromý statický CompositionContainer compositionContainer = null;

veřejný statický kontejner CompositionContainer

       {

dostat

           {

if (compositionContainer == null)

               {

var adresář katalog =

nový DirectoryCatalog (

Path.GetDirectoryName (

Assembly.GetExecutingAssembly (). Location));

positionContainer = nový CompositionContainer (adresářCatalog);

               }

návrat složeníContainer;

           }

       }

   }

Následující fragment kódu ukazuje, jak můžete načíst instanci typu FileLogger prostřednictvím kontejneru.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue ();

Podobně k načtení instance typu DbLogger můžete použít následující fragment kódu.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue ();

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