Inversion of Control
March 26th, 2007 by TrilobyteTags:Castle Project, Inversion of Control, MicroKernel, Windsor Container
Ik ben sinds enige tijd bezig met het ontwikkelen van een softwarepakket met behulp van een Inversion of Control container en ik ben er erg enthousiast over, vandaar deze post.
Om maar bij het begin te beginnen: Wat is Inversion of Control?
IoC wordt meestal gebruikt in een raamwerk om deze uitbreidbaar te maken voor ontwikkelaars. Het basis principe is dat het raamwerk weet van de uitbreidingen en deze zelf aanroept. Dit in tegenstelling tot de traditionele API waar de uitbreiding ontwikkelaar het raamwerk aanroept. Dat betekent concreet dat het raamwerk de baas is. Oftewel de rollen zijn omgedraaid.Voor andere definities, zie bronner: [1], [3] en [4].
Inversion of Control container?
Het IoC patroon wordt meestal geïmplementeerd met behulp van een IoC container. Deze container bevat een register van alle componenten in het hele systeem. Dit register is verantwoordelijk voor het creëren en opruimen van de componenten als ook het bijhouden van de configuratie en de afhankelijkheden van andere componenten. Dit reduceert de koppeling tussen de diverse component, met als gevolg dat ze makkelijker herbruikbaar, te onderhouden en te testen zijn.
Zoals je misschien hebt opgemerkt maakt de IoC container gebruik van het Dependency Injection patroon om de componenten zo los mogelijk van elkaar te houden.
Waarom is IoC zo geweldig?
IoC stelt je als ontwikkelaar in staat om gemakkelijk afhankelijkheden en configuratie te beheren Doordat koppelingen voorkomen kunnen worden, kan de ontwikkelaar zich richten op zijn eigen taak zonder zich druk hoeft te maken over allerlei afhankelijkheden. Het onderhouden en testen van code is eenvoudiger en ook kunnen componenten gemakkelijker opnieuw gebruikt worden.
Doordat afhankelijkheden in de configuratie geregeld worden, kun je als applicatie beheerder gemakkelijk onderdelen vervangen door andere onderdelen zonder dat er een programmeur aan te pas hoeft te komen.
Dit alles heeft tot gevolg dat softwareprojecten eenvoudiger worden en met grotere zekerheid uitgevoerd kunnen worden, iets waar iedereen voordeel van heeft.
Welke IoC container te gebruiken?
Er zijn verschillende implementaties van IoC containers voor verschillende platformen. Zelf gebruik ik WindsorContainer uit het Castle Project [2]. Deze container werkt op het .NET platform, mijn favoriete ontwikkelomgeving. Ik ben er pas een aantal weken mee aan het werk en ik ving het geweldig werken, nou zal ik niet beweren dat Windsor de beste is omdat het de enige IoC container is die ik tot nog toe gebruikt heb.
Mocht iemand ervaring hebben met een andere IoC containers, geef dan je mening in een reactie op deze post.
Op de wikipedia pagina over IoC [1] staat een overzicht van een aantal IoC containers gesorteerd op platform en taal.
Voorbeeld:
Het onderstaande voorbeeld maakt gebruik van de WindsorContainer van het Castle Project. Het is een eenvoudig voorbeeld puur gericht om het IoC principe te demostreren. De onderstaande code is ook niet compleet. Klik hier om de hele code te downloaden.
Klasse diagram van het model:

Configuratie:

De configuratie specificeert twee componenten: De MessageFactory en de SmtpSender. De SmtpSender wordt geinitialiseerd met de gespecificeerde host name en port (zie constructor van de SmtpSender klasse).
Code:

De code is, zoals je kunt zien, erg eenvoudig. De code bestaat uit een viertal delen: Het eerste deel creëert en configureert de IoC container. Het volgende code gedeelte bestaat uit twee stappen: Het ophalen van de IMessageFactory implementatie klasse uit de IoC container en het creëren van het bericht. Het derde deel haalt eerst de IMessageSender implementatie klasse op, om vervolgens daarmee het bericht te versturen. En tot slot het laatste deel dat niks anders doet dan opruimen. Dat is alles!
Inversion of Control is, naar mijn mening, een krachtig principe dat er voor zorgt dat je op een totaal andere manier software gaat ontwikkelen. Het ontwikkelen met behulp van het IoC principe even wennen is, het vergt namelijk een andere denkwijze, maar mijn ervaring is dat je na een paar kleine test applicaties, je het principe goed onder de knie hebt en de kracht optimaal kan benutten.
Dat is het wel weer voor deze post, en volgende posts over dit onderwerp zal ik wat meer op de details ingaan. Ik hoop dat je deze post leuk en nuttig vond om te lezen! Als je nog vragen of opmerkingen hebt dan hoor ik het graag!
Bronnen
| [1] | Wikepedia over Inversion of Control |
| [2] | Castle Project |
| [3] | Stefano Mazzocchi over Inversion of Control |
| [4] | Martin Fowler over Inversion of Control |