🔗 Dependency Injection = Loose Coupling
Tight coupling makes code inflexible. Dependency Injection decouples classes. Testable, maintainable, flexible.
❌ Tight Coupling
public class UserService
{
private readonly EmailService _emailService;
public UserService()
{
_emailService = new EmailService();
}
}
✅ Dependency Injection
public class UserService
{
private readonly IEmailService _emailService;
public UserService(IEmailService emailService)
{
_emailService = emailService;
}
}
📝 Register Services
// Program.cs var builder = WebApplication.CreateBuilder(args); // Transient: new instance every time builder.Services.AddTransient(); // Scoped: new instance per request builder.Services.AddScoped (); // Singleton: single instance (lifetime) builder.Services.AddSingleton (); // Using DI in Controllers [ApiController] [Route("api/[controller]")] public class UsersController : ControllerBase { private readonly IUserService _userService; private readonly ILogger _logger; public UsersController( IUserService userService, ILogger logger) { _userService = userService; _logger = logger; } [HttpGet] public async Task GetUsers() { var users = await _userService.GetAllAsync(); return Ok(users); } } # DI Tips - Transient: lightweight, stateless - Scoped: per request (web apps) - Singleton: stateful, expensive - Use interfaces for abstraction - Follow Dependency Inversion Principle
💡 DI Tips
- Transient: lightweight, stateless
- Scoped: per request (web apps)
- Singleton: stateful, expensive
- Use interfaces for abstraction
- Follow Dependency Inversion Principle
“DI makes code testable and maintainable. Loose coupling, flexible architecture. Essential for enterprise apps.”
