Programavimas

Kaip dirbti su valdomo išplėtimo sistema C #

„MEF“ („Managed Extensibility Framework“) yra komponentas, pateiktas kartu su .Net Framework 4 (arba naujesnėmis versijomis) ir padedantis kurti lengvas ir išplėstines programas pritaikant laisvai sujungtą įskiepių architektūrą. Galite pasinaudoti šia sistema norėdami sužinoti ir išplėsti plėtinius, be jokių konfigūracijos poreikių. Naudodami MEF galite lengvai pagerinti savo programų lankstumą, prižiūrimumą ir testavimą. Naudodami MEF, galite pakartotinai naudoti plėtinius toje pačioje programoje arba net visose programose.

MSDN teigia: "Tvarkoma išplėtimo sistema arba MEF yra biblioteka, skirta kurti lengvas, išplečiamas programas. Tai leidžia programų kūrėjams atrasti ir naudoti plėtinius nereikalaujant konfigūracijos. Tai taip pat leidžia plėtinių kūrėjams lengvai įterpti kodą ir išvengti trapių sunkių priklausomybių. ne tik leidžia pakartotinai naudoti plėtinius programose, bet ir visose programose. "

DI, IoC ir MEF

DI (priklausomybės injekcija) yra IoC (valdymo inversija) principo įgyvendinimas. Jame teigiama, kad kai objektas yra priklausomas nuo kitų objektų, tokie objektai turėtų būti sukurti naudojant atskirą sistemą arba komponentą. Nors IoC yra galimybė keisti sutarties vykdymą, DI yra galimybė pateikti reikiamą įgyvendinimą, kai to paprašoma. Atminkite, kad IoC talpyklas turėtumėte naudoti, kai jūsų priklausomybės yra statinės - jei jos yra dinamiškos, MEF yra daug naudingesnis. Iš esmės DI talpyklose palaikoma objektų sudėtis, viso gyvenimo valdymas ir perėmimas.

Priešingai nei įprastas priklausomybės injekcijos konteineris, pvz., „Unity“, „NInject“, „Castle Windsor MEF“ palaiko tik objektų kompoziciją. MEF suteikia galimybę išplėsti papildinius - tai funkcija, kurios tipiniai TOK konteineriai nepalaiko.

MEF yra valdoma biblioteka, įtraukta į naujausių „NetNet Framework“ versijų dalį (tiksliau - „NetNet Framework 4“), kad būtų galima rasti plėtinius sudarant kompoziciją be jokios konfigūracijos. MEF komponentas yra žinomas kaip dalis. Dalis deklaratyviai nurodo savo priklausomybes ir galimybes. Šios priklausomybės yra žinomos kaip „Importas“, o galimybės pateikiamos per „Eksportą“. Atkreipkite dėmesį, kad dalyje turėtų būti nurodytas atributas „Export“.

Darbo pradžia

Dirbdami su MEF galite naudoti bet kurį iš dviejų būdų. Tai apima: atributais pagrįstą ir konvencijomis pagrįstą požiūrį. Naudodami pirmąjį, paprastai naudokitės savo kodo atributais. Priešingai, pastarojoje norėtumėte sukurti taisyklių rinkinį ir tada nustatyti taikomas taisykles ir netaikomas taisykles. Šiame pavyzdyje mes išnagrinėsime pirmąjį požiūrį.

MEF suteikia jums išplėtimo galimybes naudojant papildinio sistemą. „System.Composition“ vardų sritis palaiko MEF .NET. Norėdami pradėti naudoti MEF savo programoje, turėtumėte įtraukti „System.Composition“ surinkimą kaip nuorodą į savo projektą.

Dabar apsvarstykite šią sąsają, pavadintą ILogger, pateiktą žemiau.

viešoji sąsaja ILogger

   {

eilutė Pranešimas {get; rinkinys; }

   }

Šios „FileLogger“ ir „DbLogger“ klasės įgyvendina „ILogger“ sąsają.

[Eksportuoti]

viešoji klasė FileLogger: ILogger

   {      

vieša eilutė Pranešimas

       {

pasiruošti;

       }

   }

[Eksportuoti]

viešoji klasė DbLogger: ILogger

   {

vieša eilutė Pranešimas

       {

gauti; rinkinys;

       }

   }

Iš pirmo žvilgsnio galite manyti, kad MEF yra tarsi DI konteineris. Vis dėlto, nors MEF atrodo kaip DI konteineris, jo pagrindinis tikslas yra išplėtimas. Iš esmės MEF pasinaudoja atributais paremtu atradimo mechanizmu, kad būtų galima išplėsti, nes reikia konfigūruoti komponentus. Jums nereikia jokios registracijos - jums tiesiog reikia pažymėti savo tipus „Export“ atributu ir visa tai padaro už jus. Skirtingai nei „Unity“, naudodami MEF, galite tiesiog pažymėti savo klases naudodami atributus, nereikalaudami jų atskirai registruoti. Visos eksportuojamos vertės saugomos konteineryje. Ši klasė parodo, kaip galite sukurti pasirinktinį MEF konteinerį ir jame laikyti visą eksportą iš katalogo, kuriame yra dabartinis vykdomasis rinkinys.

viešoji statinė klasė MEFContainer

   {

privati ​​statinė „CompositionContainer“ sudėtisContainer = null;

viešasis statinis „CompositionContainer Container“

       {

gauti

           {

jei (sudėtisContainer == null)

               {

var directoryCatalog =

naujas katalogas katalogas (

Path.GetDirectoryName (

Assembly.GetExecutingAssembly (). Vieta));

compositionContainer = new CompositionContainer (directoryCatalog);

               }

grąžinimo sudėtisKonteineris;

           }

       }

   }

Šis kodo fragmentas parodo, kaip per konteinerį galite gauti „FileLogger“ tipo egzempliorių.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue ();

Panašiai, norėdami gauti „DbLogger“ tipo egzempliorių, galite naudoti šį kodo fragmentą.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue ();

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