Riprendendo il post introduttivo alla dependency injection, sono numerosi i pacchetti in nuget che consentono di creare injection in maniera semplice. Ninject è un dependency injector open-source per .NET e vanta un numero piuttosto cosistente di scaricamenti ed installazioni. Alcuni dei punti di forza che vengono enfatizzati dal team di sviluppo sono la semplicità e la facilità di utilizzo.
Nello sviluppo di applicazioni Web, in particolare MVC, l’utilizzo di un dependency injector consente di realizzare velocemente soluzioni “switchando” tra repository differenti. Questo significa che è possibile realizzare applicazioni con dati “demo” facilmente testabili e successivamente passare ai dati in produzione.
Dopo avere creato una soluzione MVC (ma anche Webapi) è necessario scaricare il pacchetto di Ninject ricercandolo all’interno di Nuget. Al momento della scrittura di questo post l’ultima versione disponibile è la 3.3.0. Il pacchetto da installare sarà Ninject.Web.Mvc che scaricherà anche il pacchetto core necessario per garantire la compilazione della nuova applicazione.
Fino a qualche versione fa, era necessario utilizzare il file NinjectWebCommon.cs all’interno del quale effettuare la registrazione delle dipendenze. La versione 3.0 porta con sè un nuovo modo per effettuare la registrazione : la modifica del global.asax facendolo ereditare da NinjectHttpApplication. Una volta effettuata la modifica, sarà sufficiente configurare il binding tra le interfacce astratte e la loro implementazione.
Configurazione
Di seguito il file global.asax modificato per poter utilizzare Ninject:
public class MvcApplication : NinjectHttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
protected override IKernel CreateKernel()
{
var kernel = new StandardKernel();
RegisterServices(kernel);
return kernel;
}
private void RegisterServices(IKernel kernel)
{
kernel.Bind<IProducts>().To<Products>();
}
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
All’interno del metodo RegisterService(…) è presente la configurazione del binding: ogni volta che verrà indicata l’interfaccia IProducts, verrà sostituita con la reale implementazione della class Products.
Ovviamente Ninject consente di effettuare binding piuttosto complessi mantenendo la semplicità di configurazione e di utilizzo.