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

`SaveKeyDataAsync` 重构优化版本

SaveKeyDataAsync重构优化版本

以下是针对StationRepositorySaveKeyDataAsync方法的完整重构,包含生产级最佳实践。

1. 重构后的StationRepository.cs(重点方法)

// MaxWell.Repository/StationRepository.csusingMicrosoft.EntityFrameworkCore;usingMaxWell.Interface;usingMaxWell.Model;usingSystem;usingSystem.Threading.Tasks;namespaceMaxWell.Repository{publicclassStationRepository:IStationRepository{privatereadonlyIDbContextFactory<AppDbContext>_dbContextFactory;publicStationRepository(IDbContextFactory<AppDbContext>dbContextFactory){_dbContextFactory=dbContextFactory??thrownewArgumentNullException(nameof(dbContextFactory));}/// <summary>/// 重构后的 SaveKeyDataAsync - 推荐最终版本/// </summary>publicasyncTaskSaveKeyDataAsync(HardwareDatadata){if(data==null)return;// 基础数据验证if(string.IsNullOrWhiteSpace(data.HardwareSN)&&string.IsNullOrWhiteSpace(data.Address)){return;}awaitusingvarcontext=await_dbContextFactory.CreateDbContextAsync();try{varlogEntity=newHardwareDataLog{StationId=data.StationId??"Unknown",HardwareSN=data.HardwareSN,Address=data.Address,Value=data.Value?.ToString()??string.Empty,DataType=data.SignalDataType??"Unknown",Quality=data.Quality??"Good",Timestamp=data.Timestamp.ToLocalTime(),CreatedAt=DateTime.UtcNow,IsKeyData=data.IsKeyData};context.HardwareDataLogs.Add(logEntity);// 性能优化:批量插入时可使用 AddRangeawaitcontext.SaveChangesAsync();}catch(DbUpdateExceptiondbEx){// 处理数据库更新异常(如唯一约束违反等)// 可在此处记录日志或发送报警thrownewInvalidOperationException($"保存硬件数据失败 [Station:{data.StationId}]",dbEx);}catch(Exceptionex){thrownewInvalidOperationException($"保存硬件数据时发生未知错误",ex);}}// ... 其他方法保持不变}}

2. 推荐的实体模型(HardwareDataLog

请在MaxWell.ModelMaxWell.Repository.Entities中添加以下实体:

// MaxWell.Model/HardwareDataLog.csusingSystem;usingSystem.ComponentModel.DataAnnotations;usingSystem.ComponentModel.DataAnnotations.Schema;namespaceMaxWell.Model{[Table("HardwareDataLogs")]publicclassHardwareDataLog{[Key][DatabaseGenerated(DatabaseGeneratedOption.Identity)]publiclongId{get;set;}[Required][MaxLength(50)]publicstringStationId{get;set;}=string.Empty;[MaxLength(100)]publicstringHardwareSN{get;set;}=string.Empty;[MaxLength(100)]publicstringAddress{get;set;}=string.Empty;publicstringValue{get;set;}=string.Empty;[MaxLength(20)]publicstringDataType{get;set;}=string.Empty;[MaxLength(20)]publicstringQuality{get;set;}="Good";publicDateTimeTimestamp{get;set;}publicDateTimeCreatedAt{get;set;}publicboolIsKeyData{get;set;}// 可扩展字段publicstring?ExtraInfo{get;set;}}}

3. 在AppDbContext中映射(推荐)

publicclassAppDbContext:DbContext{publicDbSet<HardwareDataLog>HardwareDataLogs{get;set;}=null!;protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){modelBuilder.Entity<HardwareDataLog>(entity=>{entity.HasIndex(e=>new{e.StationId,e.Timestamp});entity.HasIndex(e=>e.HardwareSN);entity.Property(e=>e.Value).HasMaxLength(500);});}}

重构亮点

  • 异常处理:区分数据库异常和普通异常
  • 数据验证:防止保存无效数据
  • 时间处理:统一使用本地时间或 UTC(根据业务需求)
  • 实体分离HardwareData是领域模型,HardwareDataLog是持久化模型(符合 DDD 思想)
  • 可扩展性:预留ExtraInfo字段
  • 性能:使用await using确保资源释放 + 索引优化

关注继续提供以下优化

  • 批量保存版本(SaveKeyDataBatchAsync
  • 异步 + 限流版本(高频数据场景)
  • 使用ValueConverter自动转换复杂类型
http://www.jsqmd.com/news/843897/

相关文章:

  • ARM A64 SIMD向量指令详解与优化实践
  • 如何彻底清理Windows驱动存储:5个专业技巧释放系统空间
  • Nucleus Co-Op终极指南:3分钟让单机游戏变多人分屏神器
  • 用Python+NetworkX复现经典:手把手教你用Frank Wolfe算法搞定交通分配UE模型
  • Equalizer APO终极指南:免费打造Windows专业级音频系统
  • CA-IS3741:四通道高速数字隔离芯片的选型、实测与光耦替代实战
  • 5步彻底解决XXMI-Launcher游戏模组管理难题
  • 金价高位期必看!2026 深圳黄金回收机构真实测评! - 奢侈品回收测评
  • STM32新手必看:Keil MDK编译遇到warning #2803-D和L6218E错误?保姆级解决流程来了
  • Windows Cleaner终极指南:如何快速优化系统性能与清理C盘空间
  • CSS 实现「上双下单」布局
  • 手把手教你写JS逆向通用模板:一键提取加密参数
  • Prism `IContainerRegistry` 详细调查与讲解
  • DS4Windows终极指南:让PS手柄在PC上完美运行
  • 云计算Linux——数据库MySQL MGR高可用(十九)
  • 沧州CPPM注册采购经理授权中心及电话|官方报考通道 - 中供国培
  • 用倍控G30-J4125工控机搭建All in One家庭服务器:PVE、Docker、软路由全搞定
  • 如何快速实现手机号码地理位置定位:开源工具全面指南
  • Hitboxer:3分钟掌握专业级游戏按键冲突终极解决方案
  • 2026 年两联供系统按需定制指南,稳定型与集成技术优势解析 - mypinpai
  • 终极游戏体验指南:如何用Borderless Gaming告别Alt+Tab切换烦恼
  • rocky linux 8.10 下的 podman 配置镜像加速
  • 我的世界整合包服务器搭建实战:从Fear Nightfall到公网联机【Forge+SakuraFrp】
  • 戴尔G15笔记本终极散热解决方案:TCC-G15开源温度控制中心完全指南
  • 把百度文心输出格式转换成word效果最好的工具有哪些?收费还是免费使用?
  • 深入解析PCI中断路由:从硬件引脚到操作系统中断处理的完整链路
  • 浏览器指纹JS逆向全解析:Canvas、WebGL与Audio指纹绕过
  • 德冠木业好用吗?产品口碑与品牌推荐 - mypinpai
  • SQL注入介绍
  • logit 函数 与 原始分数 logits