Design pattern

in Architetture Software, Informatica

Dependency Injection con Ninject

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.