Il Managed Extensibility Framework (MEF) è un framework introdotto con il .NET Framework 4 e Silverlight 4 il cui scopo è facilitare la modularità delle applicazione e automatizzare la composizione delle istanze e delle dipendenze dei tipi.
Sebbene non è propriamente un motore di IoC, può essere utilizzato come tale attraverso gli attributi di Import e Export, per risolvere le classi e le loro dipendenze ma non sfruttandone tutte le altre capacità, come la ricomposizione. Ciò nonostante, una delle mancanze che principalmente si sente, rispetto ad un motore di IoC, è il fatto di poter registrare a runtime delle istanze che le composizioni degli oggetti potremmo aver bisogno.
In realtà questo task è facilmente implementabile attraverso un ExportProvider personalizzato che permette di registrare le istanze e di restituirle quando viene richiesto un export. Per farlo occorre creare una classe che sovrascriva il metodo GetExportsCore, come nell'esempio seguente.
class InstanceExportProvider : ExportProvider { private Dictionary<String, Object> instances = new Dictionary<string,object>(); protected override IEnumerable<Export> GetExportsCore(ImportDefinition definition, AtomicComposition atomicComposition) { object o; // Cerco tra i contratti registrati manualmente if (instances.TryGetValue(definition.ContractName, out o)) // Restituisco un Export con lambda per restituire l'istanza return new Export[] { new Export(definition.ContractName, () => o) }; // Altrimenti non restituisco alcun export return Enumerable.Empty<Export>(); } internal void Add(string contract, object instance) { // Registro l'istanza in base al nome del contratto instances[contract] = instance; } }
In questo metodo viene richiesto, data una specifica definizione di Import, il relativo Export per la composizione. Nell'esempio si crea un Export che restituisca sempre l'istanza che corrisponde al contratto. Tali istanze sono mantenute tramite un dictionary che viene popolato con il metodo Add.
A questo punto è sufficiente creare il CompositionContainer passando l'export provider personalizzato. Su quest'ultimo sarà quindi possibile passare le istanze personalizzate con il metodo Add ed effettuare la composizione come si è soliti in MEF.
InstanceExportProvider provider = new InstanceExportProvider(); provider.Add(miaDipendenza.GetType().FullName, miaDipendenza); CompositionContainer container = new CompositionContainer(provider); this.container.SatisfyImportsOnce(mioOggettoDaComporre);
Per approfondimenti su MEF
https://www.winfxitalia.com/articoli/architettura/introduzione-prism-mef.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare Model as a Service su Microsoft Azure
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Sostituire la GitHub Action di login su private registry
Testare l'invio dei messaggi con Event Hubs Data Explorer
Generare un hash con SHA-3 in .NET
Creare un'applicazione React e configurare Tailwind CSS
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Estrarre dati randomici da una lista di oggetti in C#
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Generare velocemente pagine CRUD in Blazor con QuickGrid
I più letti di oggi
- Accedere con ASP.NET ad un documento XML creato dall'oggetto recordset di ADO e ASP
- Richiamare programmaticamente le operazioni di aggiornamento, eliminazione e inserimento di FormView, DetailsView e GridView
- Aumentare la scalabilità di ASP.NET Core Web API con caching client side
- Visualizzare contenuti Fullscreen con HTML5
- Disabilitare un bottone in una pagina HTML pensando all'accessibilità
- Realizzare siti sicuri con ASP.NET Web Pages
- Focus dei tag input con HTML5
- Disponibile la beta di Silverlight 5
- Ricavare lo spazio occupato su disco dal nostro sito