Werken met het Managed Extensibility Framework in C #

Het MEF (Managed Extensibility Framework) is een component die wordt geleverd met .Net Framework 4 (of hoger) en helpt u applicaties te bouwen die lichtgewicht en uitbreidbaar zijn door een losjes gekoppelde plug-in-achtige architectuur te gebruiken. U kunt profiteren van dit framework om extensies te ontdekken en te gebruiken zonder dat er enige configuratie nodig is. Door MEF te gebruiken kunt u de flexibiliteit, onderhoudbaarheid en testbaarheid van uw applicaties gemakkelijk verbeteren. Wanneer u MEF gebruikt, kunt u de extensies binnen dezelfde applicatie of zelfs tussen applicaties hergebruiken.

De MSDN stelt: "Het Managed Extensibility Framework of MEF is een bibliotheek voor het maken van lichtgewicht, uitbreidbare applicaties. Het stelt applicatie-ontwikkelaars in staat extensies te ontdekken en te gebruiken zonder dat configuratie vereist is. Het stelt extensieontwikkelaars ook in staat gemakkelijk code in te kapselen en kwetsbare harde afhankelijkheden te vermijden. niet alleen kunnen extensies worden hergebruikt binnen applicaties, maar ook tussen applicaties. "

DI, IoC en MEF

DI (Dependency Injection) is een realisatie van het IoC (Inversion of Control) principe. Het stelt dat wanneer een object afhankelijk is van andere objecten, dergelijke objecten moeten worden gemaakt met behulp van een afzonderlijk framework of onderdeel. Hoewel IoC het vermogen is om de uitvoering van een contract te variëren, is DI het vermogen om de noodzakelijke implementatie te bieden wanneer daarom wordt gevraagd. Merk op dat u IoC-containers moet gebruiken wanneer uw afhankelijkheden statisch zijn - als ze dynamisch zijn, is MEF veel nuttiger. In wezen bieden de DI-containers ondersteuning voor Object Composition, Lifetime Management en Interceptie.

In tegenstelling tot een typische injectiecontainer met afhankelijkheid, zoals Unity, NInject, biedt Castle Windsor MEF alleen ondersteuning voor het samenstellen van objecten. MEF biedt u een manier om plug-ins uit te breiden - een functie waarvoor de typische IOC-containers geen ondersteuning bieden.

MEF is een beheerde bibliotheek die deel uitmaakt van de recente versies van .Net Framework (sinds .Net Framework 4 om precies te zijn) om extensies te ontdekken via compositie zonder dat er enige configuratie nodig is. Een component in MEF staat bekend als een onderdeel. Een deel specificeert zijn afhankelijkheden en mogelijkheden declaratief. Deze afhankelijkheden staan ​​bekend als "Imports" en de mogelijkheden worden weergegeven via "Exports". Merk op dat een onderdeel een "Export" -attribuut moet hebben.

Ermee beginnen

Wanneer u met MEF werkt, kunt u een van de twee benaderingen gebruiken. Deze omvatten: de op attributen gebaseerde en op conventie gebaseerde benaderingen. Als u de eerste gebruikt, profiteert u doorgaans van de kenmerken van uw code. Integendeel, in de laatste zou u een reeks regels willen maken en vervolgens de regels bepalen die van toepassing zijn en welke regels niet van toepassing zijn. In dit voorbeeld onderzoeken we de eerste benadering.

MEF biedt u uitbreidbaarheid via een plug-in-framework. De System.Composition-naamruimte biedt ondersteuning voor MEF in .Net. Om aan de slag te gaan met het gebruik van MEF in uw applicatie, moet u de System.Composition-assembly opnemen als een verwijzing naar uw project.

Beschouw nu de volgende interface genaamd ILogger die hieronder wordt gegeven.

public interface ILogger

   {

       string Message { get; set; }

   }

The following classes FileLogger and DbLogger implement the ILogger interface.

[Export]

   public class FileLogger : ILogger

   {      

       public string Message

       {

           get;set;

       }

   }

[Export]

   public class DbLogger : ILogger

   {

       public string Message

       {

           get; set;

       }

   }

Op het eerste gezicht zou je kunnen aannemen dat MEF als een DI-container is. Hoewel MEF eruitziet als een DI-container, is het vooral gericht op uitbreidbaarheid. In wezen maakt MEF gebruik van een op attributen gebaseerd detectiemechanisme om uitbreidbaarheid te bevorderen zonder de noodzaak om de componenten te configureren. U heeft geen registratie nodig - u hoeft alleen uw typen te markeren met het exportattribuut en het doet alles voor u. In tegenstelling tot Unity kunt u bij het gebruik van MEF uw klassen markeren met attributen zonder dat u ze afzonderlijk hoeft te registreren. De geëxporteerde waarden worden allemaal opgeslagen in een container. De volgende klasse laat zien hoe u een aangepaste MEF-container kunt bouwen en daarin alle exports kunt opslaan uit de directory waar de huidige uitvoerende assembly zich bevindt.

public static class MEFContainer

   {

       private static CompositionContainer compositionContainer = null;

       public static CompositionContainer Container

       {

           get

           {

               if (compositionContainer == null)

               {

                   var directoryCatalog =

                        new DirectoryCatalog(

                       Path.GetDirectoryName(

                       Assembly.GetExecutingAssembly().Location));

                   compositionContainer = new CompositionContainer(directoryCatalog);

               }

               return compositionContainer;

           }

       }

   }

Het volgende codefragment illustreert hoe u een exemplaar van het type FileLogger via de container kunt ophalen.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue();

Evenzo kunt u het volgende codefragment gebruiken om een ​​instantie van het type DbLogger op te halen.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue();