当前位置: 首页 > news >正文

手把手教你:在.Net 8的ABP框架中,同时集成FreeSql和SqlSugar(附完整代码)

在ABP框架中同时集成FreeSql与SqlSugar的深度实践指南

当企业级应用需要同时兼顾开发效率与性能优化时,多ORM混搭架构正成为.NET技术栈的新趋势。本文将深入探讨如何在ABP VNext框架中实现FreeSql与SqlSugar的双引擎集成,通过模块化设计让两种ORM各展所长。

1. 混合ORM架构的设计价值

在微服务与模块化开发盛行的当下,单一ORM很难满足所有业务场景的需求。FreeSql以零配置、强类型著称,特别适合快速迭代的业务模块;而SqlSugar凭借卓越的读写性能,往往是高频交易场景的首选。ABP框架的依赖注入系统为这种混合架构提供了天然支持。

实际项目中最常见的混用场景包括:

  • 历史模块使用SqlSugar需要保留
  • 报表模块依赖FreeSql的复杂查询能力
  • 需要对比两种ORM在真实业务中的表现
  • 渐进式迁移过程中的过渡方案

提示:混合架构会增加一定复杂度,建议在项目规模达到20个以上领域模型时考虑采用

2. 环境准备与基础配置

2.1 创建ABP VNext项目

使用ABP CLI创建模块化解决方案:

abp new Acme.BookStore -t app -u mvc --mobile none --database-provider mysql

2.2 添加ORM包引用

在领域层和基础设施层添加NuGet包:

<!-- FreeSql全家桶 --> <PackageReference Include="FreeSql.Provider.MySql" Version="3.2.800" /> <PackageReference Include="FreeSql.DbContext" Version="3.2.800" /> <!-- SqlSugar核心包 --> <PackageReference Include="SqlSugarCore" Version="5.1.4.59" />

2.3 数据库连接配置

在appsettings.json中配置多数据库连接:

"ConnectionStrings": { "Default": "Server=localhost;Port=3306;Database=BookStore;Uid=root;Pwd=123456;", "ReadReplica": "Server=replica1;Port=3306;Database=BookStore;Uid=readonly;Pwd=123456;" }

3. 模块化集成方案

3.1 FreeSql模块实现

创建FreeSqlModule.cs实现ABP模块:

[DependsOn(typeof(AbpDddModule))] public class FreeSqlModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { var configuration = context.Services.GetConfiguration(); var freeSql = new FreeSqlBuilder() .UseConnectionString(DataType.MySql, configuration.GetConnectionString("Default")) .UseAutoSyncStructure(false) // 禁用自动迁移 .UseMonitorCommand(cmd => Logger.LogDebug($"FreeSql执行:{cmd.CommandText}")) .Build(); context.Services.AddSingleton<IFreeSql>(freeSql); context.Services.AddFreeRepository(); } }

3.2 SqlSugar模块实现

创建SqlSugarModule.cs配置作用域:

[DependsOn(typeof(AbpDddModule))] public class SqlSugarModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddSingleton<ISqlSugarClient>(provider => { var config = provider.GetRequiredService<IConfiguration>(); return new SqlSugarScope(new ConnectionConfig() { DbType = DbType.MySql, ConnectionString = config.GetConnectionString("Default"), IsAutoCloseConnection = true }, db => { db.Aop.OnLogExecuting = (sql, pars) => { Logger.LogInformation($"SqlSugar执行:{sql}"); }; }); }); } }

4. 双ORM仓储模式设计

4.1 基础仓储抽象类

// FreeSql仓储基类 public abstract class FreesqlRepository<TEntity> : DomainService where TEntity : class, IEntity { protected IFreeSql FreeSql => LazyServiceProvider.LazyGetRequiredService<IFreeSql>(); public virtual async Task<TEntity> GetAsync(long id) { return await FreeSql.Select<TEntity>() .Where(x => x.Id == id) .ToOneAsync(); } } // SqlSugar仓储基类 public abstract class SqlSugarRepository<TEntity> : DomainService where TEntity : class, new() { protected ISqlSugarClient Db => LazyServiceProvider.LazyGetRequiredService<ISqlSugarClient>(); public virtual async Task<TEntity> GetAsync(dynamic id) { return await Db.Queryable<TEntity>() .InSingleAsync(id); } }

4.2 业务仓储实现示例

public class BookRepository : SqlSugarRepository<Book>, ITransientDependency { public async Task<List<Book>> GetHotBooksAsync(int count) { return await Db.Queryable<Book>() .OrderBy(b => b.Sales, OrderByType.Desc) .Take(count) .ToListAsync(); } } public class AuthorRepository : FreesqlRepository<Author>, ITransientDependency { public async Task<List<Author>> GetPopularAuthorsAsync() { return await FreeSql.Select<Author>() .Include(a => a.Books) .Where(a => a.Fans > 1000) .ToListAsync(); } }

5. 应用服务层的最佳实践

5.1 多ORM服务注入模式

public class BookAppService : ApplicationService { private readonly BookRepository _sqlSugarRepo; private readonly AuthorRepository _freeSqlRepo; public BookAppService( BookRepository sqlSugarRepo, AuthorRepository freeSqlRepo) { _sqlSugarRepo = sqlSugarRepo; _freeSqlRepo = freeSqlRepo; } public async Task<BookWithAuthorDto> GetBookDetailsAsync(long id) { var book = await _sqlSugarRepo.GetAsync(id); var author = await _freeSqlRepo.GetAsync(book.AuthorId); return new BookWithAuthorDto { Book = book, Author = author }; } }

5.2 事务跨ORM处理方案

public async Task CreateOrderAsync(OrderCreateDto input) { using (var uow = UnitOfWorkManager.Begin( requiresNew: true, isTransactional: true)) { try { // FreeSql操作 await _freeSqlRepo.InsertAsync(input.Books); // SqlSugar操作 await _sqlSugarRepo.AddAsync(input.Order); await uow.CompleteAsync(); } catch { await uow.RollbackAsync(); throw; } } }

6. 性能优化与调试技巧

6.1 连接池配置建议

ORM类型参数推荐值说明
FreeSqlPoolSize100连接池大小
SqlSugarConnectionPoolSize50连接池实例数
通用IdleTimeout300空闲连接超时(秒)

6.2 日志监控配置

在appsettings.json中添加:

"Logging": { "LogLevel": { "FreeSql": "Debug", "SqlSugar": "Information" } }

6.3 常见问题排查

  1. 依赖冲突:检查Newtonsoft.Json版本是否兼容
  2. 事务失效:确保UnitOfWork作用域正确
  3. 性能下降:监控连接泄露情况
  4. 迁移差异:禁用自动迁移功能

在ABP框架中同时使用两种ORM,就像为项目配备了瑞士军刀和手术刀——前者应对日常开发游刃有余,后者则在性能关键路径上精准高效。经过多个项目的实践验证,这种架构特别适合需要兼顾开发速度与运行效率的中大型商业系统。

http://www.jsqmd.com/news/848830/

相关文章:

  • 别只盯着准确率:聊聊我在部署Yolov5+ResNet唇语识别模型时踩过的那些‘工程化’的坑
  • 别再死磕公式了!用ADS的Smith Chart Utility,5分钟搞定L型阻抗匹配网络设计
  • 别再死记硬背了!用Python+Transformers库5分钟搞懂Token分词(附代码实战)
  • 2026年第二季度武汉建筑劳务分包可靠服务商深度与优选指南 - 2026年企业推荐榜
  • 别再只盯着NAS盘位了!用闲置硬盘+硬盘阵列盒,低成本搞定家庭数据冷热备份
  • 为什么这款免费绘图软件正在成为团队协作的新标准?
  • 告别纯教程:用树莓派4B+NCNN+YOLOv5-Lite做个智能门铃(附完整C++项目代码)
  • MySQl安装
  • 从零开始:手把手教你为6槽VPX背板选配GPU和存储卡,打造专属AI计算节点
  • 量子对角化与对称性自适应方法在强关联系统中的应用
  • 让老旧电脑焕发新生:tiny11builder精简Windows 11系统全攻略
  • 2026年升降晾衣机可靠性解析:隐藏式晾衣架/伸缩晾衣架/全自动晾衣机/全自动晾衣架/两大品牌技术实力对比 - 优质品牌商家
  • 给单片机新手:用Keil5和C51实现按键控制LED的3种玩法(附完整代码)
  • 别再只调速度差了!深入聊聊循迹小车走不直的真正原因与PID调参入门
  • 2026年钢模板厂家评测:核心维度靠谱度对比 - 优质品牌商家
  • 从“理想”到“真实”:在Ansys Zemax中优化二向分色分光镜模型的3个关键步骤
  • STC8H单片机ADC实战:从电位器读取到串口显示电压的完整流程(附代码)
  • 告别纯理论:手把手用Python模拟漂移加惩罚算法,理解李雅普诺夫函数与虚拟队列
  • Keil调试器I2C软件模拟实现与问题排查
  • 必看!球墨铸铁井盖专业测评,山东铭达铸造产品排名第一!
  • 别再只跑测试了!用KAIR库从零训练你自己的SwinIR超分模型(附DIV2K/Flickr2K数据集处理避坑指南)
  • 多芯片集成VQC架构:突破高维数据量子处理瓶颈
  • 实验室台柜公司厂家:你真以为只是“柜子”|深圳中南实验室建设
  • 第五章:如何读懂AI产品的技术架构图——PM的架构识别指南
  • 2026年质量好的广东替塑涂层公司哪家好 - 品牌宣传支持者
  • 从信号到振镜:STM32F103 + XY2-100协议 + AM26LS31芯片的激光打标/雕刻系统信号链搭建指南
  • 告别CO02手工维护:教你用Excel批量导入SAP工单BOM组件(含VBA脚本)
  • Mediasoup WebRtcTransport创建全流程解析
  • GUI Guider事件回调函数详解:以STM32按键控制LVGL仪表盘为例
  • 为什么很多人学不会渗透?因为一开始就没学HTTP