在领域驱动设计(DDD)中,IUnitOfWork(工作单元接口)是一种设计模式,主要用于管理领域对象的生命周期、协调数据持久化操作,并确保数据一致性。它的核心作用是将一组相关的数据库操作(如新增、修改、删除)封装为一个 “原子单元”,要么全部成功提交,要么全部失败回滚,避免部分操作成功导致的数据不一致问题。
核心职责
-
跟踪领域对象的变更
工作单元会记录领域模型中对象的状态变化(新增、修改、删除),例如:- 当你通过仓储(Repository)获取一个实体并修改其属性时,
IUnitOfWork会跟踪这个修改。 - 当你新增一个实体或标记一个实体为删除时,这些操作也会被记录。
- 当你通过仓储(Repository)获取一个实体并修改其属性时,
-
协调事务性提交
当业务操作完成后,通过IUnitOfWork的Commit()方法,一次性将所有跟踪的变更提交到数据库,并确保这是一个事务性操作(ACID 特性)。如果提交过程中发生错误,则通过Rollback()方法回滚所有变更。 -
减少数据库交互
避免对每个对象的单独修改都立即执行 SQL 操作,而是批量处理变更,减少数据库访问次数,提升性能。 -
解耦业务逻辑与数据访问
业务层无需直接操作数据库事务,只需通过IUnitOfWork协调提交,降低了业务逻辑与具体数据访问技术(如 EF Core、ADO.NET)的耦合。
典型使用场景
在 DDD 中,IUnitOfWork 通常与仓储(Repository) 配合使用,例如:
csharp
// 工作单元接口
public interface IUnitOfWork
{
// 获取指定类型的仓储
IRepository<TEntity> GetRepository<TEntity>() where TEntity : class, IAggregateRoot;
// 提交事务
Task<int> CommitAsync(CancellationToken cancellationToken = default);
// 回滚事务
Task RollbackAsync(CancellationToken cancellationToken = default);
}
// 业务服务中使用
public class OrderService
{
private readonly IUnitOfWork _unitOfWork;
public OrderService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public async Task CreateOrder(OrderDto dto)
{
// 1. 获取订单仓储
var orderRepository = _unitOfWork.GetRepository<Order>();
var productRepository = _unitOfWork.GetRepository<Product>();
// 2. 业务逻辑:创建订单、扣减库存等
var order = new Order(dto.CustomerId);
foreach (var item in dto.Items)
{
var product = await productRepository.GetByIdAsync(item.ProductId);
product.ReduceStock(item.Quantity); // 修改产品库存
order.AddItem(product.Id, product.Name, item.Quantity, product.Price);
}
// 3. 跟踪变更(由仓储告知工作单元)
await orderRepository.AddAsync(order);
// 4. 提交所有变更(事务性)
await _unitOfWork.CommitAsync();
}
}
为什么在 DDD 中重要?
- 维护领域一致性:DDD 中聚合根(Aggregate Root)要求内部状态的一致性,
IUnitOfWork确保聚合内的所有变更在一个事务中提交。 - 简化复杂业务流程:当一个业务操作涉及多个仓储(如订单创建同时修改库存、用户余额)时,
IUnitOfWork统一管理这些操作的事务。 - 符合 “领域优先” 原则:业务逻辑专注于领域规则,而非数据库事务细节,由
IUnitOfWork透明处理数据持久化的一致性。
注意事项
IUnitOfWork通常与具体 ORM 框架结合实现(如 EF Core 的DbContext本质上就是工作单元的实现)。- 避免滥用:单一业务操作应对应一个工作单元,过长的事务可能导致性能问题或锁竞争。
- 在分布式场景中,可能需要与分布式事务(如 Saga 模式)配合,但这已超出传统
IUnitOfWork的范畴。
总之,IUnitOfWork 是 DDD 中连接领域模型与数据持久化的关键组件,核心目标是确保业务操作的数据一致性。

596

被折叠的 条评论
为什么被折叠?



