kitlau
kitlau

kitlau's blog

C#


如何在 CSharp 和 EF Core 中使用 UTC 时间

本文介绍了在C#和EF Core中使用UTC时间处理跨时区场景的完整解决方案。首先通过ValueConverter为EF Core中所有以"Utc"结尾的DateTime属性设置UTC时间标识,确保从数据库读取的时间保持UTC特性。接着使用Mapster库创建DTO对象,通过自定义映射规则将UTC时间自动转换为本地时间,其中ProductDto的Created和Modified属性通过调用ToLocalTime方法实现时区转换。该方案解决了外贸网站部署在不同时区时可能出现的时间显示错误问题,通过实体类与DTO的分离保持了领域模型的纯净性,同时利用映射配置集中处理时间转换逻辑。最终通过设置TypeAdapterConfig配置映射规则,验证了UTC时间到本地时间的成功转换及其DateTimeKind属性的正确性,完整实现了跨时区场景下的时间一致性保障。--Qwen3

.NET C# EF Core utc time mapster time zones

C# 3 年前的 record 你现在用上了吗?

C# 9.0引入的record类型通过不可变性和值语义重构了数据建模逻辑,其简洁语法让DTO、领域事件等场景的代码质量显著提升,但三年来却鲜有开发者真正拥抱这一特性。文章从内存层面解析了record作为引用类型与class、struct的本质差异——它在托管堆上与class共享垃圾回收机制,却通过不可变设计规避了引用类型常见的状态污染问题。这种设计哲学与IReadOnlyCollection等只读集合形成呼应,共同构建了防御性编程的基石。然而在行业实践中,record的冷遇暴露了开发者对代码质量的集体忽视:当市场更关注交付速度而非长期维护性时,不可变性带来的线程安全、可预测性等优势反而成为效率的"枷锁"。更吊诡的是,AI代码生成工具的崛起正在重塑开发者的价值体系——当GPT-4能自动生产符合规范的代码时,开发者是否还会为record的类型安全买单?文章最后抛出尖锐质疑:在追求效率的时代,代码质量是否正在被牺牲?当AI接管编码工作时,record的不可变性是否反而成为阻碍快速迭代的绊脚石?这些拷问指向一个更深层的命题:当工具逐渐替代人力,我们是否正在失去对代码质量的掌控?--Qwen3

.NET C# Record Immutability Value Semantics Data Modeling

为什么我的接口,慢得跟蜗牛一样啊?- 1. 使用 Serilog 结构化日志

在现代Web开发中,忽视日志监控可能导致性能问题如野草般蔓延,就像快速构建的"漏船"最终需要耗费数倍人力进行补救。本文通过Serilog的结构化日志方案,揭示了如何将传统日志转化为可追踪、可分析的结构化数据,为分布式系统性能优化提供全新视角。通过将日志字段标准化处理(包括ActionId、RequestId等关键追踪标识),开发者不仅能精准定位性能瓶颈,更可为后续的自动化监控和根因分析奠定基础。这种日志范式转变带来的不仅是技术层面的提升,更是团队协作模式的革新——当每个请求都成为可解析的数据单元,跨服务问题追踪、故障回溯将变得前所未有的高效。值得注意的是,作者特别指出日志存储方案的弹性选择空间:从文档数据库到云原生日志服务,不同架构需求都能找到适配方案。这引发了一个值得深思的问题:当结构化日志成为基础设施的一部分,我们是否正在重新定义软件系统的"感知神经系统"?而如何利用这些日志数据构建自愈系统,或许正是下一代云原生架构需要突破的关键。--Qwen3

.NET Performance C# Serilog Web API ASP.NET Core

谁是你的菜?IEnumerable、IQueryable 和 ICollection 选择指南

这篇博客深入探讨了C#中IEnumerable IQueryable和ICollection等集合接口的使用场景与潜在陷阱通过实际代码示例揭示了IEnumerable的延迟执行特性可能导致的多次迭代问题例如当Task集合被重复遍历时引发的代码行为异常作者进一步比较了三种接口的核心差异IEnumerable强调遍历灵活性IQueryable专为数据库等数据源的高效查询设计而ICollection则提供元素增删操作但核心建议远不止于此文章指出在方法返回值设计中应避免直接返回IQueryable以防止抽象泄露导致调用方过度依赖底层数据源实现细节同时推荐使用IReadOnlyCollection等不可变集合类型作为返回值既保证集合安全性又提供Count属性等实用功能此外博客还强调了延迟执行的双刃剑效应当使用IEnumerable作为返回值时需警惕数据源生命周期与遍历时机的耦合问题通过将IQueryable限制在Repository层内部使用并最终转换为IEnumerable可实现更好的封装性文章最后抛出值得深思的问题如何在不可变集合与集合可变性之间找到平衡如何设计既能满足功能需求又避免潜在陷阱的集合返回策略当面对大量数据处理时如何在内存操作与数据库查询之间做出最优选择这些思考将引导开发者重新审视集合类型的选择逻辑并建立更稳健的代码设计模式--Qwen3

.NET C# Code Quality IEnumerator IQueryable Lazy Evaluation