当前位置: 首页 > 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.zskr.cn/news/1325108.html

相关文章:

  • 第6篇:Few-shot与Chain-of-Thought——教会AI如何思考
  • 为什么这款免费绘图软件正在成为团队协作的新标准?
  • AzurLaneAutoScript:解放双手的碧蓝航线智能自动化脚本
  • 量子对角化与对称性自适应方法在强关联系统中的应用
  • 从零开始:手把手教你为6槽VPX背板选配GPU和存储卡,打造专属AI计算节点
  • 从RTL Viewer到仿真波形:用Quartus II给你的Verilog代码做一次‘可视化体检’
  • 别再只盯着NAS盘位了!用闲置硬盘+硬盘阵列盒,低成本搞定家庭数据冷热备份
  • Keil调试器I2C软件模拟实现与问题排查
  • 告别手动点点点:用TSMaster自动诊断流程批量刷写ECU的完整配置方案
  • 必看!球墨铸铁井盖专业测评,山东铭达铸造产品排名第一!
  • QPSK实验箱避坑指南:载波不同步、I/Q接反怎么办?实测问题分析与解决
  • 告别CO02手工维护:教你用Excel批量导入SAP工单BOM组件(含VBA脚本)
  • 告别死板虚线!用CSS linear-gradient画出可自定义间距的虚线边框(附完整代码)
  • 告别Keil!用CLion+STM32CubeMX搭建嵌入式开发环境,手把手教你搞定国产芯片(如CS32)的烧录难题
  • 边缘防护视角下的站点抗攻击建设思路
  • SegFormer的‘轻量解码器’凭什么能work?可视化ERF告诉你Transformer和CNN的本质区别
  • 软路由入门踩坑实录:在VirtualBox上跑OpenWrt,如何搞定网卡桥接和宿主机上网?
  • Simscape Electrical电机控制仿真完整教程:从入门到精通的5步实践指南
  • 破解人类微生物组数据分析难题:curatedMetagenomicData的完整解决方案
  • 河北防爆监控哪家质量好
  • ESP32 ADC采样避坑大全:从WiFi冲突到内存爆炸,我的五个实战教训(附代码)
  • Qt新手也能搞定的GPU加速图片渲染:用QOpenGLWidget和QImage实现高性能显示
  • 手把手教你用LwIP RAW API在STM32上实现一个能自动重连的TCP客户端
  • 2026江阴贵金属回收技术指南:江阴商务礼品回收/江阴奢侈品回收/江阴奢侈品高价回收/江阴礼品回收/江阴老酒回收/选择指南 - 优质品牌商家
  • 宇视DMX易用性推宣—即时回放进度条拖动(B3358P510版本开始支持)
  • Perplexity财经数据查询深度解析(机构级API调用秘钥首次公开)
  • 2026年主流教育加盟品牌排行:托管加盟费用、教育加盟哪家好、教育加盟多少钱、教育加盟排名、教育加盟推荐、教育加盟费用选择指南 - 优质品牌商家
  • 河北防爆监控哪个厂家技术好
  • 2026鄂尔多斯黄金上门回收选购攻略:东胜区名酒回收、东胜区足金首饰回收、东胜区钱币回收、东胜区钻戒回收、鄂尔多斯名表回收选择指南 - 优质品牌商家
  • 【路径规划】基于A星算法实现图结构中的多机器人路径规划附matlab代码