Gestione di Plugin con ASP.NET e la Reflection

di: Francesco Camarlinghi     18 Giugno 2008

Il supporto ai plugin è sicuramente una funzionalità fondamentale per molte applicazioni, dai sistemi di gestione di forum e blog fino ai CMS.

Un plugin (letteralmente "inserisci") è una estensione di un programma che ne espande le funzionalità di base. In un blog, ad esempio, una estensione potrebbe aggiungere il supporto ad una nuova tipologia di feed, modificare come vengono visualizzati i messaggi, etc.

In questo articolo vedremo come creare un sistema di gestione dei plugin servendoci di ASP.NET e del namespace System.Reflection, che fornisce gli strumenti per esplorare la struttura degli assembly e dei tipi contenuti al loro interno, come classi, interfacce, etc.

Per rendere la spiegazione più chiara, implementiamo un plugin molto semplice. Potremmo trovare alcuni limiti a questa applicazione ma via via li evidenzieremo e sicuramente ci forniranno spunti per successivi sviluppi.

Struttura dell'applicazione

Il cuore della nostra applicazione è composto principalmente da un'interfaccia, IPlugin ed una classe, PluginManager. Nel realizzare il progetto di esempio, ho preferito inserire queste due classi in una DLL a se stante, da inserire quindi nella cartella Bin del sito.

IPlugin è l'interfaccia che una classe dovrà implementare per essere considerata un plugin. In questo modo potremo, grazie alla reflection, navigare fra le classi caricando soltanto quelle contrassegnate come estensione.

All'interno dell'interfaccia sono definite le proprietà e i metodi che tutti i plugin dovranno implementare, fornendo in questo modo anche un punto di accesso alle funzionalità dell'estensione, sconosciute all'applicazione.

Nel nostro esempio IPlugin è molto semplice:

public interface IPlugin
{
  string Name { get; }
  void DoAction();
}

Abbiamo definito la proprietà Name, che rappresenta il nome del plugin, e il metodo DoAction() che rappresenta il punto di accesso. Una volta che l'estensione sarà caricata potremo richiamarne le funzionalità proprio attraverso questo metodo.

In una implementazione più completa, altre proprietà tipiche potrebbero essere il nome dell'autore, il sito Web di riferimento, una breve descrizione del plugin, etc.

Un punto fondamentale nella nostra architettura è aver dichiarato questa interfaccia come pubblica, rendendola quindi accessibile da altri assembly. In questo modo potremo creare un file DLL per ogni plugin, rendendo di fatto più semplice aggiungere, aggiornare ed eliminare le estensioni caricate nella nostra applicazione.

La classe statica PluginManager si occupa invece del caricamento e della gestione dei plugin. In particolare offre:

  • una lista statica (List) contenente i plugin caricati
  • una funzione InitializePlugins() che si occupa di esplorare la cartella Bin/Plugins del sito alla ricerca di tutti i file ".dll" contenuti al suo interno (vedremo fra poco perchè la scelta è caduta proprio su questa cartella)
  • un'altra funzione, LoadPlugin(string assemblyName), che, dato il nome di un assembly, si occupa di caricare fisicamente un singolo plugin

Guide ASP.Net

Guida Windows Azure Code Snippets

Le migliori pratiche per far girare le applicazioni "in the cloud",...

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Progettazione database

11 Maggio 2012 a Milano
Disponibilità: 6 Posti

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto