Omdat we onze applicaties modulair opzetten komt het nogal eens voor dat een ontwikkelaar gebruik maakt van modules van een andere ontwikkelaar. De meeste voorbeelden van IOC-containers initialiseren de container vanuit de client applicatie, met als gevolg dat deze applicatie toegang moet hebben tot alle classes die geregistreerd moeten worden bij de container. Voor dit voorbeeld gebruik ik een web api (.NET MVC fullstack), die we stapsgewijs zullen opzetten met gebruik van SimpleInjector als IOC-framework.

Stap 1

Installeer de benodigde NuGet packages om SimpleInjector te kunnen gebruiken in je web api project.

Stap 2

Creëer in je App_Start map een InjectorConfig class aan en geef deze een statische methode waarin je de initialisatie van de SimpleInjector gaat opnemen.

Stap 3

Voeg in je global.asax een regel toe waarmee de injector configuratie wordt aangeroepen.

Stap 4

Maak een nieuwe instantie van een SimpleInjector container aan en laat je container de api controllers registreren. Registreer vervolgens de container als dependency resolver.

Stap 5

Registreer de afhankelijkheden die in je client applicatie zelf zitten.
Op dit moment is je client applicatie klaar om de inversion of control te gebruiken. In dit voorbeeld wil ik een service library gaan gebruiken waarin een aantal services zitten die vanuit de client gebruikt moeten worden:

Binnen deze library zitten echter ook afhankelijkheden waar ik de developer van de client niet mee lastig wil vallen. Om die reden is de client voorzien van een volgende class:

In dit bovenstaande voorbeeld zijn feitelijk alle geregistreerde classes internal. Alleen de InjectorConfiguration zelf en de interfaces van de EmployeeService en ActivityService zijn publiek.

Door deze configuratie classes aan te roepen vanuit de injector configuration van de client, worden de afhankelijkheden ingevuld zonder dat ik als developer me druk hoef te maken over de interne werking van de library die ik zojuist gekoppeld heb.

Last but not least
De SimpleInjector heeft een hele handige functie om bij het opstarten van de applicatie de volledige boomstructuur van afhankelijkheden na te lopen om te zien of er ergens registraties missen.

Roep hiervoor de container.Verify() functie aan. In het voorbeeld hierboven is deze functie zodanig ingebouwd dat hij alleen aangeroepen wordt als de applicatie in debug modus draait om te voorkomen dat het opstarten van de applicatie in productie nodeloos lang duurt. Omdat alle afhankelijkheden hier vanuit code ingesteld worden, is er ook geen risico dat de applicatie zich in productie anders gedraagt.

Auteur: Menno Jongerius, Bergler Competence Center © 2017