Programmering

Hvordan jobbe med Managed Extensibility Framework i C #

MEF (Managed Extensibility Framework) er en komponent som følger med .Net Framework 4 (eller videre) og hjelper deg med å bygge applikasjoner som er lette og utvidbare ved å ta i bruk en løst koblet plugin-lignende arkitektur. Du kan dra nytte av dette rammeverket for å oppdage og utnytte utvidelser uten behov for enhver konfigurasjon. Ved bruk av MEF kan du enkelt forbedre fleksibiliteten, vedlikeholdbarheten og testbarheten til applikasjonene dine. Når du bruker MEF, kan du bruke utvidelsene i samme applikasjon eller til og med på tvers av applikasjoner.

MSDN sier: "The Managed Extensibility Framework eller MEF er et bibliotek for å lage lette, utvidbare applikasjoner. Det lar applikasjonsutviklere oppdage og bruke utvidelser uten konfigurasjon nødvendig. Det lar også utvidelsesutviklere enkelt kapsle inn kode og unngå skjøre harde avhengigheter. MEF lar ikke bare utvidelser brukes på nytt i applikasjoner, men også på tvers av applikasjoner. "

DI, IoC og MEF

DI (Dependency Injection) er en realisering av IoC (Inversion of Control) -prinsippet. Den sier at når et objekt er avhengig av andre objekter, skal slike objekter opprettes ved hjelp av et eget rammeverk eller en komponent. Mens IoC er evnen til å variere implementeringen av en kontrakt, er DI muligheten til å gi den nødvendige implementeringen når du blir bedt om det. Merk at du bør bruke IoC-containere når avhengighetene dine er statiske - hvis de er dynamiske, er MEF mye mer nyttig. I utgangspunktet gir DI-containere støtte for Object Composition, Lifetime Management og Interception.

I motsetning til en typisk avhengighetsinjeksjonsbeholder som Unity, NInject, gir Castle Windsor MEF bare støtte for objektsammensetning. MEF gir deg en måte å utvide plugin-moduler på - en funksjon som de typiske IOC-containerne ikke gir støtte for.

MEF er et administrert bibliotek som inngår som en del av de nyeste versjonene av .Net Framework (siden. Net Framework 4 for å være mer presis) for å oppdage utvidelser gjennom komposisjon uten behov for noen konfigurasjon. En komponent i MEF er kjent som en del. En del spesifiserer dens avhengighet og evner deklarativt. Disse avhengighetene er kjent som "Import" og mulighetene er representert via "Eksport". Merk at en del skal ha en "Eksporter" attributt nevnt.

Starter

Når du jobber med MEF, kan du bruke en av de to tilnærmingene. Disse inkluderer: attributtbasert og konvensjonsbasert tilnærming. Når du bruker førstnevnte, vil du vanligvis dra nytte av attributter på koden din. Tvert imot, i sistnevnte ønsker du å lage et sett med regler og deretter bestemme reglene som gjelder og hvilke regler som ikke gjelder. I dette eksemplet vil vi utforske den første tilnærmingen.

MEF gir deg utvidbarhet gjennom et plugin-rammeverk. System.Composition-navneområdet gir støtte for MEF i .Net. For å komme i gang med å bruke MEF i applikasjonen din, bør du inkludere System.Composition-enheten som en referanse til prosjektet ditt.

Vurder nå følgende grensesnitt som heter ILogger gitt nedenfor.

offentlig grensesnitt ILogger

   {

streng Melding {get; sett; }

   }

Følgende klasser FileLogger og DbLogger implementerer ILogger-grensesnittet.

[Eksport]

offentlig klasse FileLogger: ILogger

   {      

public string Message

       {

klar;

       }

   }

[Eksport]

offentlig klasse DbLogger: ILogger

   {

public string Message

       {

få; sett;

       }

   }

Ved første øyekast kan du anta at MEF er som en DI-container. Imidlertid, selv om MEF ser ut som en DI-container, sikter den hovedsakelig mot utvidbarhet. I hovedsak utnytter MEF en attributtbasert oppdagelsesmekanisme for å fremme utvidbarhet uten behov for å konfigurere komponentene. Du trenger ingen registrering - du trenger bare å merke typene dine med Export-attributtet, og det gjør alt for deg. I motsetning til Unity, når du bruker MEF, kan du bare merke klassene dine ved hjelp av attributter uten å måtte registrere dem individuelt. De eksporterte verdiene er alle lagret i en container. Følgende klasse viser hvordan du kan bygge en tilpasset MEF-container og lagre all eksporten fra katalogen der den nåværende utførende forsamlingen ligger.

offentlig statisk klasse MEFContainer

   {

privat statisk CompositionContainer compositionContainer = null;

offentlig statisk CompositionContainer Container

       {

           {

if (compositionContainer == null)

               {

var katalogKatalog =

ny katalogkatalog (

Path.GetDirectoryName (

Assembly.GetExecutingAssembly (). Location));

compositionContainer = ny CompositionContainer (katalogKatalog);

               }

retur komposisjon Container;

           }

       }

   }

Følgende kodebit illustrerer hvordan du kan hente en forekomst av typen FileLogger via beholderen.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue ();

På samme måte kan du bruke følgende kodebit for å hente en forekomst av typen DbLogger.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue ();

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