Вопрос проверяет понимание паттерна Unit of Work для управления транзакциями и согласованностью данных в приложении.
Unit of Work (UoW) — это паттерн проектирования, который поддерживает список объектов, измененных в рамках одной бизнес-операции, и координирует запись этих изменений в базу данных как единой транзакции. Основная цель — обеспечить атомарность операций: либо все изменения сохраняются, либо ни одно из них.
Представьте, что вы работаете с заказом в интернет-магазине. При оформлении заказа нужно: уменьшить количество товара на складе, создать запись о заказе и списать средства с карты клиента. Если каждая операция выполняется отдельно, при сбое на одном из шагов данные станут несогласованными. Unit of Work собирает все изменения в одном месте и применяет их только после вызова метода Commit().
public class OrderService {
private readonly IUnitOfWork _unitOfWork;
private readonly IRepository<Order> _orders;
private readonly IRepository<Product> _products;
public OrderService(IUnitOfWork unitOfWork) {
_unitOfWork = unitOfWork;
_orders = unitOfWork.GetRepository<Order>();
_products = unitOfWork.GetRepository<Product>();
}
public void PlaceOrder(int productId, int quantity) {
var product = _products.GetById(productId);
product.Stock -= quantity;
_products.Update(product);
var order = new Order { ProductId = productId, Quantity = quantity };
_orders.Add(order);
_unitOfWork.Commit(); // Все изменения сохраняются в одной транзакции
}
}Unit of Work — это ключевой паттерн для управления транзакциями в приложениях с базами данных. Он упрощает код, избавляя от ручного управления транзакциями, и гарантирует целостность данных. Особенно полезен в сочетании с Repository и Dependency Injection.