Dependency injection
Vanuit een programmeer standpunt gezien is indeling van code een van de belangrijkste aspecten van het programmeren. Een rommelige werkomgeving maakt het lastig om te vinden wat je nodig hebt. Het opruimen hiervan mag dan wel wat extra tijd kosten maar uiteindelijk maakt het je werk makkelijker en sneller. Zo ook in code, als alles netjes is ingedeeld verkleint dit de kans op fouten en zijn de fouten die nog wel bestaan veel sneller en gemakkelijker op te lossen.
Tegenwoordig wordt programmeercode vaak ingedeeld in classes. Hiermee wordt alle code die over eenzelfde onderdeel op bijvoorbeeld een site gaat bij elkaar gezet. Zo zijn er bijvoorbeeld een aantal functies van een knop die bij elkaar staan. De actie van de knop moet echter worden doorgestuurd naar een ander onderdeel of een andere pagina. Hiervoor moeten dus verbindingen gemaakt worden tussen de verschillenden onderdelen.
Een connectie leggen tussen twee onderdelen is vrij simpel. Overigens komen er in grotere projecten steeds meer en meer connecties bij. Hiermee kan de code alsnog onoverzichtelijk en slecht beheerbaar worden. Een onderdeel kan afhankelijk zijn van een 2e onderdeel welke op zijn beurt weer een 3e classe nodig heeft etc.
Hiervoor is de dependency injection structuur bedacht. Hierbij worden alle beschikbare classes geregistreerd in de code als services. Wanneer een van deze services benodigd is hoeft deze alleen maar opgevraagd te worden. Het programma regelt achter de schermen dat de benodigde functionaliteit op de juiste plaats komt.
Praktijk
Wanneer het programma start wordt een lijst met alle beschikbare code componenten ingeladen. Dit gebeurt in de configure service functie. Welke standaard in de Startup class beschikbaar is.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<Service, Service>();
services.AddTransient<Service, Service>();
services.AddScoped<Service, Service>();
}
Deze services bevatten de code die vanaf een andere plaatsen toegankelijk moeten zijn. Het opvragen van deze services gebeurt vervolgens via de constructor. Wanneer een nieuw stuk code wordt geschreven wordt aangegeven welke services er benodigd zijn. Het programma herkent dit en geeft bij het aanroepen van de code de correcte services mee waar gebruik van kan worden gemaakt.
public OperationService(Service service)
{
...
}
Dit maakt het beheren van code gemakkelijker en ook overzichtelijker.