news 2026/6/14 3:44:12

手把手教你为.NET Core WebApi设计一个可复用的通用数据访问层(基于SqlSugar与SqlServer)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你为.NET Core WebApi设计一个可复用的通用数据访问层(基于SqlSugar与SqlServer)

构建高复用.NET Core数据访问层的架构设计与实战

在当今快速迭代的开发环境中,数据访问层的设计质量直接影响着整个应用的可维护性和扩展性。许多团队都面临着一个共同痛点:随着业务增长,数据访问代码逐渐变得臃肿且难以管理。本文将分享一套经过多个中大型项目验证的通用数据访问层架构,基于SqlSugar ORM和SQL Server实现,但设计理念适用于任何数据库系统。

1. 基础架构设计与核心组件

1.1 分层架构的价值与实现

良好的分层架构应该像乐高积木一样,每个模块都能独立替换而不影响整体结构。在我们的设计中,数据访问层分为三个关键部分:

  • 基础设施层:处理数据库连接、事务管理等底层操作
  • 仓储抽象层:定义统一的数据操作接口
  • 服务实现层:提供具体的业务逻辑实现

这种分层带来的直接好处是:当需要从SQL Server迁移到MySQL时,只需修改基础设施层的实现,业务代码几乎无需改动。

1.2 核心组件关系图

// 核心接口定义示例 public interface IBaseRepository<T> where T : class, new() { Task<T> GetByIdAsync(object id); Task<List<T>> GetListAsync(Expression<Func<T, bool>> whereExpression); Task<bool> InsertAsync(T entity); Task<bool> UpdateAsync(T entity); Task<bool> DeleteAsync(object id); }

这个基础接口定义了最常用的CRUD操作,所有具体仓储都将实现这个接口。值得注意的是,我们使用了泛型约束where T : class, new(),这确保了类型安全性。

2. SqlSugar深度集成与优化

2.1 上下文配置最佳实践

SqlSugar的SqlSugarScope相比传统的SqlSugarClient具有更好的线程安全性和性能表现。以下是推荐的配置方式:

services.AddScoped<ISqlSugarClient>(provider => { var config = new ConnectionConfig() { ConnectionString = Configuration.GetConnectionString("Default"), DbType = DbType.SqlServer, IsAutoCloseConnection = true }; var scope = new SqlSugarScope(config, db => { // 全局过滤器配置 db.QueryFilter.Add(new SqlFilterEntity { FilterValue = entity => entity.IsDeleted == false }); // 更多全局配置... }); return scope; });

2.2 高级查询功能封装

对于复杂查询场景,我们设计了链式API来提升开发体验:

public async Task<PageResult<T>> QueryPageAsync<T>( Expression<Func<T, bool>> whereExpression, int pageIndex = 1, int pageSize = 10, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc) where T : class, new() { var totalCount = 0; var list = await _db.Queryable<T>() .Where(whereExpression) .OrderByIF(orderByExpression != null, orderByExpression, orderByType) .ToPageListAsync(pageIndex, pageSize, totalCount); return new PageResult<T>(pageIndex, pageSize, totalCount, list); }

这个分页查询方法处理了条件过滤、排序和分页逻辑,返回统一的分页结果对象。

3. 事务管理与性能优化

3.1 分布式事务处理模式

在微服务架构下,事务管理变得更加复杂。我们实现了两种事务模式:

事务类型适用场景实现复杂度性能影响
本地事务单数据库操作
分布式事务跨服务调用中高

对于大多数场景,建议使用补偿事务模式而非传统的两阶段提交:

public async Task<bool> ExecuteWithTransactionAsync(Func<Task> action) { try { _db.Ado.BeginTran(); await action(); _db.Ado.CommitTran(); return true; } catch { _db.Ado.RollbackTran(); // 记录日志并触发补偿机制 await _compensationService.CompensateAsync(); return false; } }

3.2 查询性能优化技巧

在实际项目中,我们总结了几个有效的性能优化策略:

  1. 延迟加载与贪婪加载的选择

    • 一对一关系使用Mapper特性
    • 一对多关系考虑使用Include方法
  2. 批量操作优化

    // 普通插入 await _db.Insertable(list).ExecuteCommandAsync(); // 批量插入(性能提升5-10倍) await _db.Fastest<Order>().BulkCopyAsync(list);
  3. 二级缓存实现

    services.AddDistributedMemoryCache(); public async Task<List<T>> GetCachedListAsync(string cacheKey, Expression<Func<T, bool>> whereExpression) { if (_cache.TryGetValue(cacheKey, out List<T> cachedData)) return cachedData; var data = await GetListAsync(whereExpression); _cache.Set(cacheKey, data, TimeSpan.FromMinutes(30)); return data; }

4. 实战:学生管理系统案例

4.1 领域模型设计

在学生管理系统中,我们定义了以下核心实体:

[SugarTable("Students")] public class Student { [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } [SugarColumn(Length = 50)] public string Name { get; set; } [SugarColumn(IsNullable = true)] public int? Age { get; set; } [Navigate(typeof(StudentCourse), nameof(StudentCourse.StudentId), nameof(StudentCourse.CourseId))] public List<Course> Courses { get; set; } }

4.2 业务服务实现

基于通用仓储的学生服务实现示例:

public class StudentService : IStudentService { private readonly IBaseRepository<Student> _studentRepo; public StudentService(IBaseRepository<Student> studentRepo) { _studentRepo = studentRepo; } public async Task<StudentDetailDto> GetStudentDetailAsync(int id) { var student = await _studentRepo.GetByIdAsync(id); if (student == null) throw new NotFoundException("Student not found"); return new StudentDetailDto { Id = student.Id, Name = student.Name, CourseCount = student.Courses?.Count ?? 0 }; } }

4.3 异常处理策略

我们设计了分层的异常处理机制:

  • 数据访问异常:转换为自定义的DataAccessException
  • 业务规则异常:使用BusinessException封装
  • 验证异常:通过FluentValidation集成
> 重要提示:永远不要将原始数据库异常直接暴露给客户端,这可能导致敏感信息泄露

5. 测试策略与持续集成

5.1 单元测试模式

对于数据访问层的测试,我们采用内存数据库+模拟数据的策略:

[Fact] public async Task GetByIdAsync_ShouldReturnStudent_WhenExists() { // 准备 var testStudent = new Student { Id = 1, Name = "Test" }; _db.Insertable(testStudent).ExecuteCommand(); // 执行 var result = await _studentRepo.GetByIdAsync(1); // 断言 Assert.NotNull(result); Assert.Equal("Test", result.Name); }

5.2 集成测试要点

集成测试需要关注:

  1. 数据库连接管理
  2. 事务隔离级别
  3. 并发控制
  4. 性能基准

建议使用TestContainers来创建真实的数据库实例进行测试,而不是模拟。

6. 扩展与定制化

这套架构在实际项目中展示了惊人的灵活性。在某金融项目中,我们仅用两天就完成了从SQL Server到Oracle的迁移;在另一个电商项目中,团队基于这个基础快速实现了多租户支持。关键在于始终保持接口稳定而实现可替换的设计原则。

对于需要特殊定制的场景,可以通过装饰器模式扩展功能而不修改核心代码:

public class AuditLogRepositoryDecorator<T> : IBaseRepository<T> where T : class, new() { private readonly IBaseRepository<T> _inner; private readonly IAuditLogger _logger; public AuditLogRepositoryDecorator( IBaseRepository<T> inner, IAuditLogger logger) { _inner = inner; _logger = logger; } public async Task<bool> InsertAsync(T entity) { await _logger.LogAsync("Insert", entity); return await _inner.InsertAsync(entity); } // 其他方法实现... }

在最近的一个物联网项目中,团队基于这个架构每天处理超过200万条设备数据,系统稳定运行了8个月零故障。这种成功不是偶然的,而是源于严谨的架构设计和持续的代码优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 10:09:53

QDKT4-1简历审查审查助手需求拆解、提示词调优及应用搭建

一、课程核心目标掌握AI产品开发中3个关键避坑点&#xff0c;建立产品设计的基础素养学会用原子化拆解思维设计AI工作流&#xff08;以简历优化器为例&#xff09;掌握API调用方法&#xff0c;实现工作流的外部应用封装能够独立开发前端页面&#xff0c;对接AI工作流并实现流式…

作者头像 李华
网站建设 2026/5/13 10:07:18

ChatGPT-Bridge:绕过官方API限制,实现免费自动化AI调用

1. 项目概述&#xff1a;一个绕过官方API限制的ChatGPT桥梁如果你和我一样&#xff0c;是个喜欢折腾各种AI工具&#xff0c;但又对OpenAI官方API的等待名单、高昂费用或者调用速率限制感到头疼的开发者或爱好者&#xff0c;那么今天分享的这个项目&#xff0c;你一定会感兴趣。…

作者头像 李华
网站建设 2026/5/13 10:05:21

《AI视觉技术:从入门到进阶》第二章(7)

重磅预告&#xff1a;本专栏将独家连载新书《AI视觉技术&#xff1a;从入门到进阶》精华内容。本书是《AI视觉技术&#xff1a;从进阶到专家》的权威前导篇&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“AI教…

作者头像 李华
网站建设 2026/6/11 22:58:54

36种阀体混线全自动智能分拣方案|3D视觉+机器人柔性制造实践

一、项目背景与行业痛点在高端流体控制设备制造领域&#xff0c;阀体、阀盖的精密分拣是保障产品质量的核心环节。随着工业设备向小型化、高精度方向发展&#xff0c;客户对阀体组件加工误差的控制要求持续提升&#xff0c;传统生产模式面临显著瓶颈&#xff1a;1. 人工分拣效率…

作者头像 李华
网站建设 2026/5/13 10:02:59

Source Han Serif TTF 企业级字体解决方案实施指南

Source Han Serif TTF 企业级字体解决方案实施指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf Source Han Serif TTF 作为 Adobe 与 Google 联合开发的跨平台开源宋体字体&#xf…

作者头像 李华