🔗 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<IEmailService, EmailService>();
// Scoped: new instance per request
builder.Services.AddScoped<IUserService, UserService>();
// Singleton: single instance (lifetime)
builder.Services.AddSingleton<ILogger, Logger>();
// Using DI in Controllers
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly IUserService _userService;
private readonly ILogger<UsersController> _logger;
public UsersController(
IUserService userService,
ILogger<UsersController> logger)
{
_userService = userService;
_logger = logger;
}
[HttpGet]
public async Task<IActionResult> 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.”
