Ardalis.Specification 项目中的查询构建器优化:从状态管理到计算属性
2025-07-05 23:37:28作者:侯霆垣
在软件开发中,设计模式的选择往往直接影响着代码的性能和可维护性。今天我们来探讨Ardalis.Specification项目中一个关于查询构建器(Query Builder)的重要架构优化。
背景与问题
在早期的Ardalis.Specification实现中,查询构建器被设计为一个状态对象。这意味着每个规格(Specification)实例都会持有一个构建器实例的引用,这种设计带来了两个潜在问题:
- 内存开销:每个规格实例需要额外8字节的空间来存储构建器引用
- 不必要的状态管理:构建器实际上更适合作为临时工具而非长期状态
解决方案
项目维护者决定将查询构建器从状态对象转变为计算属性。具体实现如下:
public ISpecificationBuilder<T> Query => new SpecificationBuilder<T>(this);
这种转变带来了几个显著优势:
- 按需创建:构建器只在被访问时才会实例化
- 无状态:消除了不必要的状态管理
- 内存优化:节省了每个规格实例8字节的内存空间
深入技术细节
构建器模式的应用
查询构建器采用了经典的构建器模式(Builder Pattern),这种模式特别适合创建复杂对象。在规格模式中,构建器负责逐步构造查询条件,最终生成完整的规格定义。
版本9的进一步优化
文章提到在版本9中将进一步优化构建器,目标是让整个查询可以写成单一链式调用。这意味着:
- 大多数用例只需要一次对象分配
- 更流畅的API设计
- 更好的性能表现
虚属性的移除
另一个重要变更是移除了属性的virtual修饰符。经过实践验证:
- 没有用户需要重写查询构建器的实现
- 构建器是库的核心组件,不应该被随意替换
- 移除虚调用可以带来轻微的性能提升
实际影响与最佳实践
对于库的使用者来说,这些变更意味着:
- 透明升级:现有代码无需修改,API保持兼容
- 性能提升:自动获得更高效的内存使用
- 更简洁的设计:强调了构建器作为工具而非状态的本质
开发者可以继续像以前一样使用构建器:
var spec = new CustomerSpecification()
.Query
.Where(c => c.IsActive)
.OrderBy(c => c.Name)
.Take(10);
总结
这次优化展示了如何通过深思熟虑的设计决策来提升库的性能和简洁性。将查询构建器从状态对象转变为计算属性,不仅减少了内存占用,还更好地表达了构建器作为临时工具的语义。同时,这也为未来的API改进奠定了基础,体现了良好的架构演进思路。
登录后查看全文
热门项目推荐
相关项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0191
cann-learning-hubCANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。Jupyter Notebook0113
Step-3.7-FlashStep-3.7-Flash是一个拥有 1980 亿参数的稀疏混合专家(MoE)视觉语言模型,由 1960 亿参数的语言主干网络和 18 亿参数的视觉编码器组合而成,具备原生图像理解能力。Python00
JoyAI-EchoJoyAI-Echo,这是一个独立的、仅用于推理的版本,旨在实现分钟级多镜头音视频生成。它采用了经过蒸馏的DMD生成器、配对的跨模态记忆以及故事级别的一致性。其性能的核心在于,一个跨模态视听记忆库能够在长达五分钟的视频中保持角色外观和语音音色的一致性。同时,一个训练后处理流程将基于记忆的强化学习与分布匹配蒸馏相结合,实现了7.5倍的速度提升,显著增强了视觉质量和对齐效果。00
omega-aiOmega-AI:基于java打造的深度学习框架,帮助你快速搭建神经网络,实现模型推理与训练,引擎支持自动求导,多线程与GPU运算,GPU支持CUDA,CUDNN。Java04
llm-universe本项目是一个面向小白开发者的大模型应用开发教程,在线阅读地址:https://datawhalechina.github.io/llm-universe/Jupyter Notebook08
最新内容推荐
项目优选
收起
deepin linux kernel
C
32
16
暂无描述
Dockerfile
762
4.96 K
Claude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed.
Get Started
Rust
1.8 K
191
Ascend Extension for PyTorch
Python
718
873
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
856
1.91 K
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.07 K
1.09 K
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.73 K
1.02 K
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
676
1.32 K
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
455
438
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
C
454
5.07 K