DI — Inversion of Control.
Registration:
1builder.Services.AddScoped<IUserService, UserService>();2builder.Services.AddSingleton<ICache, MemoryCache>();3builder.Services.AddTransient<IEmailSender, SmtpSender>();
Injection:
1public class OrderService(IUserService userService)2{3 public async Task<Order> CreateAsync(CreateOrderDto dto)4 {5 var user = await userService.GetByIdAsync(dto.UserId);6 return new Order(user);7 }8}
Lifetimes:
Key: Register and inject via constructor.