Programmering

Sådan arbejder du med Managed Extensibility Framework i C #

MEF (Managed Extensibility Framework) er en komponent, der følger med .Net Framework 4 (eller derover) og hjælper dig med at opbygge applikationer, der er lette og udvidelige ved at vedtage en løst koblet plugin-lignende arkitektur. Du kan drage fordel af denne ramme til at opdage og udnytte udvidelser uden behov for enhver konfiguration. Ved brug af MEF kan du nemt forbedre fleksibiliteten, vedligeholdelsesevnen og testbarheden af ​​dine applikationer. Når du bruger MEF, kan du genbruge udvidelserne inden for den samme applikation eller endda på tværs af applikationer.

MSDN siger: "The Managed Extensibility Framework eller MEF er et bibliotek til oprettelse af lette, udvidelige applikationer. Det giver applikationsudviklere mulighed for at finde og bruge udvidelser uden nogen konfiguration påkrævet. Det gør det også muligt for udvidelsesudviklere nemt at indkapsle kode og undgå skrøbelige hårde afhængigheder. MEF tillader ikke kun udvidelser at blive genbrugt i applikationer, men også på tværs af applikationer. "

DI, IoC og MEF

DI (Dependency Injection) er en realisering af IoC (Inversion of Control) -princippet. Det hedder, at når et objekt er afhængigt af andre objekter, skal sådanne objekter oprettes ved hjælp af en separat ramme eller komponent. Mens IoC er evnen til at variere implementeringen af ​​en kontrakt, er DI evnen til at levere den nødvendige implementering, når man bliver bedt om det. Bemærk, at du skal bruge IoC-containere, når dine afhængigheder er statiske - hvis de er dynamiske, er MEF meget mere nyttigt. Dybest set giver DI-containere understøttelse af objektsammensætning, livstidsstyring og aflytning.

I modsætning til en typisk afhængighedsinjektionsbeholder som Unity, NInject giver Castle Windsor MEF kun support til objektsammensætning. MEF giver dig en måde at udvide plugins på - en funktion, som de typiske IOC-containere ikke understøtter.

MEF er et administreret bibliotek, der er inkluderet som en del af de nyere versioner af .Net Framework (siden. Net Framework 4 for at være mere præcis) for at finde udvidelser gennem komposition uden behov for nogen konfiguration. En komponent i MEF er kendt som en del. En del specificerer dens afhængighed og kapacitet erklærende. Disse afhængigheder er kendt som "import", og kapaciteterne er repræsenteret via "eksport". Bemærk, at en del skal have en "eksport" -attribut nævnt.

Kom godt i gang

Når du arbejder med MEF, kan du bruge en af ​​de to tilgange. Disse inkluderer: attributbaserede og konventionbaserede tilgange. Når du bruger førstnævnte, vil du typisk drage fordel af attributter på din kode. Tværtimod, i sidstnævnte vil du oprette et sæt regler og derefter bestemme de regler, der gælder, og de regler, der ikke gælder. I dette eksempel vil vi undersøge den første tilgang.

MEF giver dig udvidelighed gennem en plug-in-ramme. System.Composition-navneområdet understøtter MEF i .Net. For at komme i gang med at bruge MEF i din applikation, skal du inkludere System.Composition-enheden som en reference til dit projekt.

Overvej nu følgende grænseflade ved navn ILogger angivet nedenfor.

offentlig grænseflade ILogger

   {

streng Besked {get; sæt; }

   }

Følgende klasser FileLogger og DbLogger implementerer ILogger-grænsefladen.

[Eksport]

offentlig klasse FileLogger: ILogger

   {      

public string Besked

       {

få; sæt;

       }

   }

[Eksport]

offentlig klasse DbLogger: ILogger

   {

public string Besked

       {

få; sæt;

       }

   }

Ved første øjekast kan du antage, at MEF er som en DI-container. Men selvom MEF ligner en DI-container, sigter den primært mod udvidelse. I det væsentlige drager MEF fordel af en attributbaseret opdagelsesmekanisme til at fremme udvidelighed uden behov for konfiguration af komponenterne. Du behøver ikke nogen registrering - du skal bare markere dine typer med attributten Eksport, og det gør alt for dig. I modsætning til enhed kan du, når du bruger MEF, bare markere dine klasser ved hjælp af attributter uden behov for at registrere dem individuelt. De eksporterede værdier er alle gemt i en container. Følgende klasse viser, hvordan du kan oprette en brugerdefineret MEF-container og gemme alle eksporten fra den mappe, hvor den aktuelle udførende samling er inde i den.

offentlig statisk klasse MEFContainer

   {

privat statisk CompositionContainer compositionContainer = null;

offentlig statisk CompositionContainer Container

       {

           {

hvis (compositionContainer == null)

               {

var directoryCatalog =

nyt katalogkatalog (

Path.GetDirectoryName (

Assembly.GetExecutingAssembly (). Location));

compositionContainer = ny CompositionContainer (katalogKatalog);

               }

retur sammensætning Container;

           }

       }

   }

Følgende kodestykke illustrerer, hvordan du kan hente en forekomst af typen FileLogger via containeren.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue ();

På samme måde kan du bruge følgende kodestykke for at hente en forekomst af typen DbLogger.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue ();