Web Forms e dependency injection
La dependency injection è una funzionalità che non è supportata nativamente dalle web form. Tuttavia utilizzando la libreria Autofac è possibile in modo molto semplice e veloce utilizzare la dependency injection nei progetti web di tipo web form.
Iniziamo con l'installare i due pacchetti nuget:
- Autofac
- Autofac.Web
Registriamo i moduli necessari per il corretto funzionamento della libreria aggiungendo le seguenti righe nel web.config
Il tipo di dependency injection che andremo a utilizzare è la "property injection", il che significa che tutte le nostre dipendenze delle pagine web dovranno essere delle proprietà con dei getter e dei setter. Creiamo una semplice interfaccia ed una classe che la implementa per testare propriamente il funzionamento della libreria.
public interface IService { string GetValue(); }
public class Service : IService { static string _value; public Service() { _value = DateTime.Now.ToString(); } public string GetValue() { return _value; } }
Assicuriamoci inoltre che nella nostra web application ci sia una web form, chiamiamola Default.aspx per semplicità, e il file Global.asax. Mettiamo un controllo Label nella pagina web con ID e nel code behind della pagina modifichiamo il codice in questo modo
public partial class Default : Page { public IService servizio { get; set; } protected void Page_Load(object sender, EventArgs e) { lblValue.Text = servizio.GetValue(); } }
Come potete osservare andiamo a utilizzare la proprietà servizio senza averla mai propriamente inizializzata, ci penserà Autofac a farlo in maniera automatica. Manca solo un ultimo pezzo al puzzle ed è quello di registrare i tipi e inizializzare il "container" che si occuperà di risolvere le dipendenze. Per farlo modifichiamo il global.asax.cs in questo modo
public class Global : HttpApplication, IContainerProviderAccessor { private static IContainerProvider _ContainerProvider; public IContainerProvider ContainerProvider { get { return _ContainerProvider; } } protected void Application_Start(object sender, EventArgs e) { var builder = new ContainerBuilder(); builder.RegisterType<Service>().As<IService>(); _ContainerProvider = new ContainerProvider(builder.Build()); } }
La parte essenziale è quella in cui diciamo di risolvere la dipendenza da IService con la classe Service. Dovendo in futuro dover cambiare classe per quell'interfaccia basterà cambiare qua e in tutte le pagine in cui utilizzeremo l'interfaccia avremo la nuova classe (dependency injection appunto!).
Potete scaricare l'applicazione completa a questo link, per utilizzarla correttamente è necessario che ripristiniate i pacchetti nuget.