首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

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

01

项目简介

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

仓储模式(Repository Pattern)

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

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

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

多数据库支持

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

分布式事务支持

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

MySQL 分库分表支持

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

02

项目特点

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

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

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

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

03

使用方法

1、项目配置

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

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

// 定义一个只读的 IUnitOfWork 字段private readonly IUnitOfWork _unitOfWork;

// 控制器构造函数,注入 IUnitOfWorkpublic 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

项目地址

https://github.com/arch/UnitOfWork

- End -

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O00gML72WHAhzGRNK-RymUyA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券