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

<system.webServer>
    <modules>
      <add name="ContainerDisposal"
           type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"
           preCondition="managedHandler" />
      <add name="PropertyInjection"
           type="Autofac.Integration.Web.Forms.PropertyInjectionModule, Autofac.Integration.Web"
           preCondition="managedHandler" />
    </modules>
  </system.webServer>

 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.

comments powered by Disqus