0

0

.NET中的工作单元模式(Unit of Work)是什么?如何与仓储模式结合使用?

月夜之吻

月夜之吻

发布时间:2025-11-11 18:37:02

|

161人浏览过

|

来源于php中文网

原创

工作单元模式通过共享DbContext协调多个仓储操作,确保事务一致性。它跟踪所有实体变更并统一提交或回滚,避免数据不一致。在.NET中,结合仓储模式使用,由UnitOfWork管理IRepository实例,并通过Complete()方法调用SaveChanges(),实现多实体事务管理。依赖注入保证同一请求中上下文唯一,广泛应用于EF Core项目以保障数据完整性。

.net中的工作单元模式(unit of work)是什么?如何与仓储模式结合使用?

工作单元模式(Unit of Work)在 .NET 中用于管理多个仓储对数据库的操作,确保所有更改在一个事务中被统一提交或回滚。它的核心作用是协调多个仓储操作,保持数据一致性,特别是在涉及多个实体或聚合根的业务逻辑中。

工作单元模式的作用

在执行一个业务操作时,可能需要更新多个不同的实体,比如订单和库存。如果每个仓储都独立提交更改,就可能出现部分成功、部分失败的情况,导致数据不一致。工作单元通过跟踪所有变更,并提供一个统一的 SaveChanges() 方法来解决这个问题。

以 Entity Framework Core 为例,DbContext 本身就实现了工作单元模式:

  • 它跟踪实体的状态变化(新增、修改、删除)
  • 支持事务管理
  • 通过一次 SaveChanges() 提交所有更改

与仓储模式结合使用

仓储(Repository)负责封装对特定实体的数据访问逻辑,而工作单元(UnitOfWork)负责协调多个仓储共享同一个数据上下文,从而实现事务一致性。

典型实现方式如下:

星火作家大神
星火作家大神

星火作家大神是一款面向作家的AI写作工具

下载
public interface IUnitOfWork : IDisposable
{
    IOrderRepository Orders { get; }
    IProductRepository Products { get; }
    int Complete(); // 对应 SaveChanges
}

public class UnitOfWork : IUnitOfWork
{
    private readonly AppDbContext _context;
    public IOrderRepository Orders { get; private set; }
    public IProductRepository Products { get; private set; }

    public UnitOfWork(AppDbContext context)
    {
        _context = context;
        Orders = new OrderRepository(_context);
        Products = new ProductRepository(_context);
    }

    public int Complete() => _context.SaveChanges();
    public void Dispose() => _context.Dispose();
}

在服务层中使用:

public class OrderService
{
    private readonly IUnitOfWork _unitOfWork;

    public OrderService(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public void PlaceOrder(Order order)
    {
        _unitOfWork.Orders.Add(order);
        _unitOfWork.Products.DecreaseStock(order.Items);
        _unitOfWork.Complete(); // 一次性提交
    }
}

依赖注入配置

Program.csStartup.cs 中注册服务:

builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddScoped();

这样能保证同一个请求中所有仓储共享同一个 DbContext 实例,确保事务一致性。

基本上就这些。工作单元 + 仓储的组合让业务逻辑更清晰,同时保障了数据完整性。.NET 生态中这种模式很常见,尤其在使用 EF Core 的项目里。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

515

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

47

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

186

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

172

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

92

2025.11.27

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

454

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

6

2025.12.06

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

27

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 38.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号