UnitOfWork:一个支持多数据库,工作单元模式、支持分布式事务以及支持 MySQL 多数据库/表分片的开源项目

针对一些大型项目、高并发的场景的项目,我们往往需要多数据库、分表的方式,才能支撑项目的运行。

今天推荐一个开源项目,让我们轻松实现,多数据库、分表的项目开发。

01 项目简介

UnitOfWork,它是一个基于 Microsoft.EntityFrameworkCore 的插件,目标是简化复杂数据库操作,同时支持以下核心功能:

  1. 仓储模式(Repository Pattern)

    提供统一的接口,方便对数据库操作进行抽象和封装。

  2. 单元工作模式(Unit of Work Pattern)

    管理多个仓储的事务,确保一组操作要么全部成功,要么全部失败,从而保证数据一致性。

  3. 多数据库支持

    支持跨多个数据库的操作,适用于复杂的分布式系统。

  4. 分布式事务支持

    在多数据库环境中,确保事务的提交或回滚是全局一致的。

  5. MySQL 分库分表支持

    动态切换数据库或表,支持 MySQL 的分库分表功能,适用于大规模数据的分布式存储。

02 项目特点

  • 动态切换数据库和表:通过 ChangeDatabase 和 ChangeTable 方法,可以灵活地在运行时切换数据库或表。

  • 简化事务管理:通过 UnitOfWork,可以轻松管理事务,确保数据一致性。

  • 支持多种数据库操作:包括插入、查询、更新、分页等常用功能。

  • 扩展性强:支持自定义仓储和扩展方法,满足复杂业务需求。

03 使用方法

1、项目配置

swift 复制代码
// 注册 DbContext
services
    // 添加 QuickStartContext 数据上下文
    .AddDbContext<QuickStartContext>(opt => 
        // 配置使用内存数据库(适用于测试环境)
        opt.UseInMemoryDatabase()
    )
    // 添加 UnitOfWork 支持
    .AddUnitOfWork<QuickStartContext>()
    // 添加自定义仓储
    // 指定 Blog 实体对应的仓储为 CustomBlogRepository
    .AddCustomRepository<Blog, CustomBlogRepository>();

2、单元模式使用、切换数据库

csharp 复制代码
// 定义一个只读的 IUnitOfWork 字段
private readonly IUnitOfWork _unitOfWork;

// 控制器构造函数,注入 IUnitOfWork
public ValuesController(IUnitOfWork unitOfWork)
{
    _unitOfWork = unitOfWork; // 将注入的 IUnitOfWork 赋值给字段

    // 动态切换数据库,目前仅支持 MySQL
    // 根据当前年份动态切换数据库,例如 "uow_db_2025"
    _unitOfWork.ChangeDatabase($"uow_db_{DateTime.Now.Year}");

    // 获取 User 和 Post 的仓储实例
    var userRepo = _unitOfWork.GetRepository<User>(); // 获取 User 的仓储
    var postRepo = _unitOfWork.GetRepository<Post>(); // 获取 Post 的仓储

    // 根据当前年份和月份动态切换表,例如 "user_202504" 和 "post_202504"
    var ym = DateTime.Now.ToString("yyyyMM");
    userRepo.ChangeTable($"user_{ym}");
    postRepo.ChangeTable($"post_{ym}");

    // 创建一个 User 实体并插入数据库
    var user = new User
    {
        UserName = "rigofunc", // 设置用户名
        Password = "password" // 设置密码
    };
    userRepo.Insert(user); // 插入 User 实体

    // 创建一个 Post 实体并插入数据库
    var post = new Post
    {
        UserId = user.UserId, // 设置关联的用户 ID
        Content = "What a piece of junk!" // 设置帖子内容
    };
    postRepo.Insert(post); // 插入 Post 实体

    // 提交事务,保存所有更改到数据库
    _unitOfWork.SaveChanges();

    // 查询 User 实体并更新密码
    var find = userRepo.Find(user.UserId); // 根据用户 ID 查询 User 实体
    find.Password = "p@ssword"; // 更新密码
    _unitOfWork.SaveChanges(); // 提交更改
}

04 项目地址

github.com/arch/UnitOf...

  • End -

推荐阅读

2个零基础入门框架教程!

SmartFormat:轻量级文本模板库,轻松替代 string.Format

Squidex:一个基于.Net功能强大的CMS开源项目

barcodelib:一个功能强大且易于使用的 C# 条形码生成库

一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略来了!

相关推荐
浪客川6 分钟前
【百例RUST - 015】闭包
开发语言·后端·rust
楼田莉子23 分钟前
仿muduo的高并发服务器——前置知识讲解和时间轮模块
服务器·开发语言·c++·后端·学习
小江的记录本24 分钟前
【分布式】分布式核心组件——分布式限流:固定窗口、滑动窗口、漏桶、令牌桶算法,网关层/服务层限流实现
java·分布式·后端·python·算法·安全·面试
Hanson,25 分钟前
SpringBoot前后端分离框架中,在请求头加入签名
java·spring boot·后端
九转成圣27 分钟前
Spring Boot 导出 Excel 最佳实践:从 POI 函数式封装到 EasyExcel 的“降维打击”
spring boot·后端·excel
liyi_hz200828 分钟前
O2OA(翱途) V10 升级说明(三)数据中心:精准查询·严谨权限·优质视图
后端·java-ee·开源软件
刀法如飞36 分钟前
一款基于 NestJS 的 DDD 脚手架,开箱即用
javascript·后端·架构
StackNoOverflow41 分钟前
SpringCloud 声明式服务调用 —— Feign 全面解析(入门 + 原理 + 优化)
后端·spring·spring cloud
fy1216343 分钟前
Spring Boot spring-boot-maven-plugin 参数配置详解
spring boot·后端·maven
AI人工智能+电脑小能手44 分钟前
【大白话说Java面试题】【Java基础篇】第3题:ArrayList和LinkedList有什么区别
java·开发语言·后端·面试·list