Ohjelmointi

Kuinka hallita C #: n hallittua laajennuskehystä

MEF (Managed Extensibility Framework) on komponentti, joka tulee .Net Framework 4: n (tai sitä uudemman) mukana ja auttaa sinua rakentamaan kevyitä ja laajennettavia sovelluksia ottamalla käyttöön löyhästi kytketyn laajennuksen kaltaisen arkkitehtuurin. Voit hyödyntää tätä kehystä etsimällä laajennuksia ja hyödyntämällä niitä minkä tahansa kokoonpanon tarpeessa. MEF: n avulla voit parantaa sovellusten joustavuutta, ylläpidettävyyttä ja testattavuutta helposti. Kun käytät MEF: ää, voit käyttää laajennuksia uudelleen samassa sovelluksessa tai jopa kaikissa sovelluksissa.

MSDN: n mukaan "Managed Extensibility Framework tai MEF on kirjasto kevyiden, laajennettavissa olevien sovellusten luomiseen. Sen avulla sovelluskehittäjät voivat löytää ja käyttää laajennuksia ilman tarvittavia määrityksiä. Sen avulla laajennuskehittäjät voivat helposti kapseloida koodin ja välttää hauraita kovia riippuvuuksia. MEF paitsi sallii laajennusten uudelleenkäytön sovelluksissa, mutta myös eri sovelluksissa. "

DI, IoC ja MEF

DI (Dependency Injection) on IoC (Inversion of Control) -periaatteen toteutus. Siinä todetaan, että kun objekti on riippuvainen muista esineistä, tällaiset objektit tulisi luoda erillisellä kehyksellä tai komponentilla. Vaikka IoC on kyky muuttaa sopimuksen täytäntöönpanoa, DI on kyky tarjota tarvittava toteutus pyydettäessä. Huomaa, että sinun on käytettävä IoC-kontteja, kun riippuvuutesi ovat staattisia - jos ne ovat dynaamisia, MEF on paljon hyödyllisempi. Periaatteessa DI-säiliöt tarjoavat tukea objektien kokoonpanolle, käyttöiän hallinnalle ja sieppaukselle.

Toisin kuin tyypillinen riippuvuusinjektiosäiliö, kuten Unity, NInject, Castle Windsor MEF tukee vain esineiden koostumusta. MEF tarjoaa sinulle mahdollisuuden laajentaa laajennuksia - ominaisuutta, jota tyypilliset IOC-säilöt eivät tue.

MEF on hallittu kirjasto, joka sisältyy osaan .Net Frameworkin uusimpia versioita (tarkemmin .Net Framework 4: n jälkeen), jotta laajennukset löytyvät sommittelun kautta ilman mitään määrityksiä. MEF: n komponentti tunnetaan osana. Osa määrittelee riippuvuutensa ja kykynsä deklaratiivisesti. Nämä riippuvuudet tunnetaan nimellä "tuonti" ja ominaisuudet esitetään "viennin" kautta. Huomaa, että osassa tulisi olla maininta Export-attribuutista.

Päästä alkuun

Kun työskentelet MEF: n kanssa, voit käyttää mitä tahansa näistä kahdesta lähestymistavasta. Näitä ovat: attribuutti- ja käytäntöpohjaiset lähestymistavat. Ensimmäistä käyttäessäsi yleensä hyödynnät koodisi määritteitä. Päinvastoin, jälkimmäisessä haluat luoda joukon sääntöjä ja määrittää sitten sovellettavat säännöt ja säännöt, joita ei sovelleta. Tässä esimerkissä tutkitaan ensimmäistä lähestymistapaa.

MEF tarjoaa laajennettavuuden laajennuskehyksen avulla. System.Composition-nimitila tukee MEF-tiedostoja .Netissä. MEF: n käytön aloittamiseksi sovelluksessa sinun tulee sisällyttää System.Composition-kokoonpano viitteenä projektiisi.

Harkitse nyt seuraavaa ILogger-nimistä käyttöliittymää.

julkinen käyttöliittymä ILogger

   {

merkkijono Viesti {get; aseta; }

   }

Seuraavat luokat FileLogger ja DbLogger toteuttavat ILogger-käyttöliittymän.

[Viedä]

julkinen luokka FileLogger: ILogger

   {      

julkinen merkkijono Viesti

       {

Valmistaudu;

       }

   }

[Viedä]

julkinen luokka DbLogger: ILogger

   {

julkinen merkkijono Viesti

       {

saada; aseta;

       }

   }

Ensi silmäyksellä saatat olettaa, että MEF on kuin DI-kontti. Vaikka MEF näyttää DI-kontilta, se pyrkii pääasiassa laajentamiseen. Pohjimmiltaan MEF hyödyntää attribuuttipohjaista etsintämekanismia laajennettavuuden edistämiseksi ilman komponenttien konfiguroinnin tarvetta. Sinun ei tarvitse rekisteröintiä - sinun tarvitsee vain merkitä tyypit Export-attribuutilla, ja se tekee kaiken puolestasi. Toisin kuin Unity, voit käyttää MEF: ää vain merkitä luokkasi attribuuteilla ilman, että sinun on rekisteröitävä niitä erikseen. Viedyt arvot tallennetaan kaikki säilöön. Seuraava luokka osoittaa, kuinka voit rakentaa mukautetun MEF-säilön ja tallentaa siihen kaiken viennin hakemistosta, jossa nykyinen suorittava kokoonpano sijaitsee.

julkinen staattisen luokan MEFContainer

   {

yksityinen staattinen CompositionContainer compositionContainer = null;

julkinen staattinen CompositionContainer Container

       {

saada

           {

if (koostumusSäiliö == null)

               {

var DirectoryCatalog =

uusi DirectoryCatalog (

Path.GetDirectoryName (

Assembly.GetExecutingAssembly (). Sijainti));

compositionContainer = uusi CompositionContainer (hakemistokatalogi);

               }

paluukoostumusSäiliö;

           }

       }

   }

Seuraava koodinpätkä kuvaa, kuinka voit hakea FileLogger -tyyppisen esiintymän säilön kautta.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue ();

Vastaavasti voit hakea DbLogger -tyyppisen ilmentymän seuraavalla koodinpätkällä.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue ();

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