Dependency Injection (DI) — это паттерн проектирования, реализующий принцип инверсии зависимостей (D из SOLID), при котором зависимости объекта не создаются внутри класса, а "внедряются" извне.
public class OrderService
{
private readonly IOrderRepository _repository;
public OrderService()
{
_repository = new SqlOrderRepository(); // Жесткая зависимость
}
public void ProcessOrder(Order order)
{
_repository.Save(order);
}
}
public class OrderService
{
private readonly IOrderRepository _repository;
public OrderService(IOrderRepository repository) // Зависимость внедряется
{
_repository = repository;
}
public void ProcessOrder(Order order)
{
_repository.Save(order);
}
}
public class ProductService
{
private readonly IProductRepository _repo;
public ProductService(IProductRepository repo)
{
_repo = repo;
}
}
public class CustomerService
{
public ICustomerRepository Repository { get; set; }
}
public class ReportGenerator
{
public void Generate(IReportFormatter formatter)
{
// ...
}
}
[Test]
public void ProcessOrder_ShouldSaveOrder()
{
// Arrange
var mockRepo = new Mock<IOrderRepository>();
var service = new OrderService(mockRepo.Object);
var order = new Order();
// Act
service.ProcessOrder(order);
// Assert
mockRepo.Verify(r => r.Save(order), Times.Once);
}
Пример настройки в ASP.NET Core:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IOrderRepository, SqlOrderRepository>(); // Создается новый для каждого запроса
services.AddScoped<IUserService, UserService>(); // Один экземпляр на запрос
services.AddSingleton<ICacheService, RedisCacheService>(); // Один на все приложение
}
var repo = ServiceLocator.Get<IOrderRepository>(); // Плохо!
new
// Пример фабрики для сложной инициализации
public interface IConnectionFactory
{
IDbConnection CreateConnection();
}
public class SqlConnectionFactory : IConnectionFactory
{
private readonly string _connectionString;
public SqlConnectionFactory(IConfiguration config)
{
_connectionString = config.GetConnectionString("Default");
}
public IDbConnection CreateConnection() => new SqlConnection(_connectionString);
}
Dependency Injection — это мощный паттерн, который помогает создавать гибкие, тестируемые и поддерживаемые приложения. Правильное использование DI приводит к архитектуре, где компоненты слабо связаны и легко модифицируются, что особенно важно в современных сложных приложениях и микросервисных архитектурах.