`SaveKeyDataAsync` 重构优化版本
✅SaveKeyDataAsync重构优化版本以下是针对StationRepository中SaveKeyDataAsync方法的完整重构包含生产级最佳实践。1. 重构后的StationRepository.cs重点方法// MaxWell.Repository/StationRepository.csusingMicrosoft.EntityFrameworkCore;usingMaxWell.Interface;usingMaxWell.Model;usingSystem;usingSystem.Threading.Tasks;namespaceMaxWell.Repository{publicclassStationRepository:IStationRepository{privatereadonlyIDbContextFactoryAppDbContext_dbContextFactory;publicStationRepository(IDbContextFactoryAppDbContextdbContextFactory){_dbContextFactorydbContextFactory??thrownewArgumentNullException(nameof(dbContextFactory));}/// summary/// 重构后的 SaveKeyDataAsync - 推荐最终版本/// /summarypublicasyncTaskSaveKeyDataAsync(HardwareDatadata){if(datanull)return;// 基础数据验证if(string.IsNullOrWhiteSpace(data.HardwareSN)string.IsNullOrWhiteSpace(data.Address)){return;}awaitusingvarcontextawait_dbContextFactory.CreateDbContextAsync();try{varlogEntitynewHardwareDataLog{StationIddata.StationId??Unknown,HardwareSNdata.HardwareSN,Addressdata.Address,Valuedata.Value?.ToString()??string.Empty,DataTypedata.SignalDataType??Unknown,Qualitydata.Quality??Good,Timestampdata.Timestamp.ToLocalTime(),CreatedAtDateTime.UtcNow,IsKeyDatadata.IsKeyData};context.HardwareDataLogs.Add(logEntity);// 性能优化批量插入时可使用 AddRangeawaitcontext.SaveChangesAsync();}catch(DbUpdateExceptiondbEx){// 处理数据库更新异常如唯一约束违反等// 可在此处记录日志或发送报警thrownewInvalidOperationException($保存硬件数据失败 [Station:{data.StationId}],dbEx);}catch(Exceptionex){thrownewInvalidOperationException($保存硬件数据时发生未知错误,ex);}}// ... 其他方法保持不变}}2. 推荐的实体模型HardwareDataLog请在MaxWell.Model或MaxWell.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{publicDbSetHardwareDataLogHardwareDataLogs{get;set;}null!;protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){modelBuilder.EntityHardwareDataLog(entity{entity.HasIndex(enew{e.StationId,e.Timestamp});entity.HasIndex(ee.HardwareSN);entity.Property(ee.Value).HasMaxLength(500);});}}重构亮点异常处理区分数据库异常和普通异常数据验证防止保存无效数据时间处理统一使用本地时间或 UTC根据业务需求实体分离HardwareData是领域模型HardwareDataLog是持久化模型符合 DDD 思想可扩展性预留ExtraInfo字段性能使用await using确保资源释放 索引优化关注继续提供以下优化批量保存版本SaveKeyDataBatchAsync异步 限流版本高频数据场景使用ValueConverter自动转换复杂类型
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2624496.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!