Middle
What is dependency injection (DI) in ASP.NET Core?
sobes.tech AI
Answer from AI
Dependency Injection (DI) is a design pattern for inversion of control (IoC) that allows for creating loosely coupled code. In ASP.NET Core, DI is a built-in feature that makes it easy to manage dependencies between classes.
Main components of DI in ASP.NET Core:
- Services: Objects that provide functionality (e.g., repository classes, logging services).
- DI Container: An object responsible for resolving dependencies and creating service instances.
- Service lifetimes: Define when and how service instances are created:
- Transient: A new instance is created each time the service is requested.
- Scoped: A single instance is created per request (for web applications — per HTTP request).
- Singleton: A single instance is created on the first request and used throughout the application's lifetime.
Advantages of using DI:
- Loose coupling: Classes depend on abstractions (interfaces), not on concrete implementations.
- Testability: Easily replace real dependencies with mocks or stubs during unit testing.
- Extensibility: Easily replace service implementations without changing dependent code.
- Manageability of dependencies: The DI container manages the lifecycle and creation of instances.
Example of registering services in Startup.cs (or Program.cs in .NET 6+):
// In ConfigureServices method
public void ConfigureServices(IServiceCollection services)
{
// Register a singleton service
services.AddSingleton<ILogger, EmailLogger>();
// Register a scoped service
services.AddScoped<IDataRepository, SqlDataRepository>();
// Register a transient service
services.AddTransient<ITransientService, TransientService>();
// Register controllers for dependency injection
services.AddControllersWithViews();
}
Dependency injection in controller constructor:
```csharp
public class HomeController : Controller
{
private readonly ILogger _logger;
private readonly IDataRepository _repository;
// ASP.NET Core DI automatically resolves and injects these dependencies
public HomeController(ILogger logger, IDataRepository repository)
{
_logger = logger;
_repository = repository;
}
// ... controller actions
}