topics

Dependency Injection

Forstå hvordan Dependency Injection bruges til at koble klasser sammen uden hårde afhængigheder.

01|Hvad er Dependency Injection?

Dependency Injection betyder, at en klasse får de ting den skal bruge udefra, i stedet for selv at oprette dem.

Det gør koden mindre låst, nemmere at teste og lettere at ændre senere.

02|Problemet uden DI

Her laver UserService selv en EmailService. Det virker, men klassen bliver hårdt bundet til lige præcis den implementation.

Without Dependency Injection

cs · 16 lines

cs
1
2public class UserService
3{
4 private readonly EmailService _emailService;
5
6 public UserService()
7 {
8 _emailService = new EmailService();
9 }
10
11 public void CreateUser(string email)
12 {
13 _emailService.SendWelcomeEmail(email);
14 }
15}
16

03|Løsningen med DI

Her får UserService sin EmailService gennem constructoren. Klassen bestemmer ikke selv, hvordan afhængigheden bliver lavet.

With Dependency Injection

cs · 16 lines

cs
1
2public class UserService
3{
4 private readonly EmailService _emailService;
5
6 public UserService(EmailService emailService)
7 {
8 _emailService = emailService;
9 }
10
11 public void CreateUser(string email)
12 {
13 _emailService.SendWelcomeEmail(email);
14 }
15}
16

04|Med interface

Ofte bruger man et interface, så servicen ikke er låst til én bestemt klasse.

Interface Example

cs · 24 lines

cs
1
2public interface IEmailService
3{
4 void SendWelcomeEmail(string email);
5}
6
7public class EmailService : IEmailService
8{
9 public void SendWelcomeEmail(string email)
10 {
11 Console.WriteLine("Welcome " + email);
12 }
13}
14
15public class UserService
16{
17 private readonly IEmailService _emailService;
18
19 public UserService(IEmailService emailService)
20 {
21 _emailService = emailService;
22 }
23}
24

05|Registrering i ASP.NET Core

I ASP.NET Core registrerer man services i Program.cs. Derefter kan frameworket selv give dem videre til controllers eller andre services.

Program.cs

cs · 4 lines

cs
1
2builder.Services.AddScoped<IEmailService, EmailService>();
3builder.Services.AddScoped<UserService>();
4

06|Sammenhæng med Separation of Concerns

Dependency Injection bruges ofte sammen med Separation of Concerns.

SoC handler om at dele ansvar op i mindre dele. DI gør det nemmere at koble de dele sammen uden at klasserne bliver hårdt bundet til hinanden.

07|Kort huskeregel

Uden DI siger klassen: “Jeg laver selv det jeg skal bruge”. Med DI siger klassen: “Giv mig det jeg skal bruge”.