In deel 1 en 2 van deze serie hebben we gekeken naar handmatige dependency injection en naar het service locator pattern. We hebben hierbij gezien dat we code geschikt kunnen maken voor automatische testen, maar we hebben ook gezien dat beide manieren van werken nog behoorlijke nadelen hebben. Hoewel het voor legacy soms de enige manier is om code te verbeteren, is het aan te raden voor nieuwe projecten gebruik te maken van IoC-frameworks.

Voldoen aan het Inversion Principle door een IoC framework
Het belangrijkste voordeel van een IoC-framework is dat afhankelijkheden (zowel in de constructor als publieke properties) automatisch geïnjecteerd worden. Dit maakt dat de Presentation, Service en Repository classes volledig losgekoppeld zijn, en de applicatie runtime aan “elkaar geknoopt” wordt door het IoC-framework. Aardige bijkomstigheid is dat de applicatie daarmee ook zeer configureerbaar wordt omdat de meeste IoC-frameworks de mogelijkheid bieden om dynamisch de toewijziging van classes te wijzigen (vanuit de config). Daarnaast kan het framework de lifecycle van classes beheren en bieden sommige frameworks de mogelijkheid voor interceptie waardoor automatisch extra stappen (bijvoorbeeld voor logging) geïntroduceerd kunnen worden op het moment dat een bepaalde class opgevraagd wordt bij het IoC-framework.

Vele wegen naar Rome
Er zijn zeer veel IoC-frameworks beschikbaar met behoorlijke verschillen in functionaliteit en performance: http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison

Welk framework je kiest hangt af van welke type applicatie je bouwt en in hoeverre het betreffende IoC-framework al standaard ondersteuning biedt voor dit type applicatie. Meestal zijn die overigens losse NuGet-packages. Voor bijvoorbeeld SimpleInjector zijn aparte packages beschikbaar voor WebApi, MVC, etc.

Een voorbeeld uit de praktijk
Het inregelen van een IoC-framework voor nieuwbouw code is meestal een fluitje van een cent. Stel bijvoorbeeld dat je een nieuwe WebApi gaat maken. Dan voldoet het om bij de start van de applicatie wat initialisatie in te stellen:

Door dit te doen, wordt het IoC-framework automatisch toegepast in de routing van de applicatie en zullen de afhankelijkheden in de controllers (en alle lagergelegen objecten) automatisch opgepakt worden:

IOC 3

Auteur: Menno Jongerius – Bergler Competence Center 2017