kitlau
kitlau

kitlau's blog

.NET .NET


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

本文介绍了一位开发者为解决外贸网站时区问题而采用UTC时间处理的方法。通过定义Product实体类并将时间字段存储为UTC,在EF Core中配置模型确保数据库存储UTC时间,并使用Mapster将UTC时间转换为美国当地时间展示给用户,避免了因时区差异导致的时间显示错误。文章详细讲解了UTC时间的概念、C#中的操作方法、EF Core的配置扩展以及Mapster工具的应用,最终实现了前台网站正确显示当地时的功能,确保产品信息准确无误。--DeepSeek

.NET C# EF Core utc time mapster time zones

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

这篇文章探讨了C#中的`record`类型及其在提高代码质量和安全性方面的重要性。文章指出,`record`类型的不可变性和值语义使其成为表示数据的理想选择,并能够减少多线程环境下的竞争条件和错误修改的风险。此外,通过使用`IReadOnlyCollection<T>`等只读集合类型,可以进一步确保数据的稳定性,从而提高代码的安全性、可预测性和可维护性。然而,文章也反思了当前软件开发中对代码质量的忽视现象,特别是在追求快速迭代和交付的过程中,一些开发者更倾向于采用快速但不稳定的解决方案,导致代码质量和维护成本的问题。作者呼吁重视代码质量,并利用像`record`这样的特性来提升软件的整体质量。--DeepSeek

.NET C# Record Immutability Value Semantics Data Modeling

微服务生产环境故障难调试?OpenTelemetry 了解一下?

本文介绍了可观测性(Observability)的概念及其重要性,以及如何通过 OpenTelemetry 提高微服务系统的可观察性。文章详细讲解了 OpenTelemetry 的核心功能,包括分布式追踪(Tracing)、性能指标(Metrics)和日志记录(Logs),并展示了其在 .NET 中的应用。通过一个运行在 Kubernetes 中的迷你微服务系统案例,演示了如何使用 OpenTelemetry 和 Jaeger 实现分布式追踪,并分析 Trace 信息以优化系统性能。文章还讨论了 OpenTelemetry 在解决传统日志系统痛点方面的优势,如支持跨组件的日志关联、统一数据模型和无缝集成能力。最后总结了 OpenTelemetry 如何帮助快速定位问题根源、监控系统状态、优化性能瓶颈以及实现跨平台和多语言的遥测数据收集与导出。--DeepSeek

.NET OpenTelemetry Observability Jaeger Microservices Distributed Tracing

为什么我的接口,慢得跟蜗牛一样啊?- 3. Seq 中心化结构化日志服务

文章介绍了如何通过配置和使用Seq集中处理结构化日志,从而解决接口性能慢的问题。作者详细说明了安装配置Seq的步骤,将其集成到ASP.NET Core应用中,并展示了如何通过日志查询和分析找到耗时过长的操作。文章还强调了Seq作为工具的优势,无需精通所有功能,按需使用即可,并提供了源代码地址供读者参考。最终,文章帮助读者实现了一个完善的日志记录和分析系统,为排查接口性能问题提供了有效的方法和思路。--DeepSeek

.NET Performance performance analysis Seq Web API Logging

为什么我的接口,慢得跟蜗牛一样啊?- 2. Serilog 记录计时和诊断日志

这篇文章介绍了如何使用Serilog来记录时间度量结果和HTTP请求日志,并展示了如何通过配置将诊断信息(如用户名和用户ID)添加到日志中。作者详细讲解了如何在ASP.NET Core应用中记录请求性能指标,追踪潜在的性能问题,并提供了具体的代码示例。文章还演示了如何通过注入`IDiagnosticContext`来设置元数据,以便在处理线上问题时快速筛选相关日志。最后,作者提到下一篇文章将介绍如何聚合多个实例的日志进行高效分析。--DeepSeek

.NET Performance Serilog Timing Metrics HTTP Request Logging Diagnostic Information

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

本文介绍了如何在 ASP.NET Web API 项目中使用 Serilog 进行结构化日志记录,详细描述了配置过程和输出结果,并展示了 JSON 格式的结构化日志内容,包括时间戳、消息、上下文信息等元数据。文章还提到可以根据团队需求选择不同的存储方式,如 MongoDB 或关系型数据库,并介绍了 Seq 等流行的服务器工具用于收集和分析日志数据,最后提供了源代码链接以便参考。--DeepSeek

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

.NET 性能技巧:为什么你应该避免使用终结器 Finalizer?

在使用 .NET 时应尽量避免使用终结器(Finalizer),因为它们会导致巨大的性能开销。通过基准测试可以看到,创建和释放一千个对象时,无终结器的类仅需5.886微秒,而有终结器的类需要111.027微秒,差距高达18.86倍。终结器的不可控性、额外性能开销(垃圾收集器需要两次扫描)以及可能导致内存泄漏的问题使其可靠性不足。更好的替代方案是实现 IDisposable 接口或使用异步资源释放 API 来确保资源可靠且可预测地释放。--DeepSeek

.NET Performance garbage collection performance optimization Finalizer IDisposable

你真的需要 Autofac 吗?Scrutor:更轻量的容器伴侣

这篇文章探讨了ServiceLocator反模式的问题,并介绍了如何使用轻量级依赖注入扩展库Scrutor来替代Autofac。作者详细讲解了几种使用Scrutor的方法,包括基于接口名称的批量注册、装饰器模式等高级功能。同时,文中还比较了两种标记方式:Marker接口和Attribute,解释了各自的优缺点。最后,文章总结了Scrutor的优势,并鼓励读者在项目中采用这种轻量级解决方案,避免引入不必要的复杂性。--DeepSeek

.NET DependencyInjection ServiceLocator BatchRegistration DecoratorPattern LightweightLibrary

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

在编程中选择合适的集合类型至关重要,需综合考虑功能需求和代码维护性。文章指出,ICollection<T>适用于需要增删元素的场景,而IQueryable<T>在处理ORM时能提升效率。返回集合类型应选择不可变的IReadOnlyCollection<T>或其子类(如IReadOnlyList<T>),以避免调用方随意修改数据源并提高代码可维护性。此外,需注意IEnumerable<T>的延迟评估特性可能引发问题,尤其是在数据库上下文已释放时进行枚举会导致错误。文章通过示例展示了不同集合类型的功能和潜在风险,并强调在选择集合类型时应兼顾功能需求和代码稳定性与维护性。--DeepSeek

.NET C# Code Quality IEnumerator IQueryable Lazy Evaluation