首页
/ Marten框架中的命名兼容性改进:ProjectionName与SubscriptionName的过渡方案

Marten框架中的命名兼容性改进:ProjectionName与SubscriptionName的过渡方案

2025-06-26 13:07:17作者:裴麒琰

背景与问题

在Marten这个基于PostgreSQL的.NET事件溯源和文档数据库框架中,随着版本演进,部分API命名需要进行合理化调整。开发团队发现原有的ProjectionNameSubscriptionName属性命名虽然直观,但在设计一致性上存在改进空间。

技术决策

Marten团队决定采用渐进式演进策略:

  1. 引入新命名规范:将相关属性统一简化为NameVersion
  2. 保持向后兼容:通过创建过渡性shim属性(包装器属性)确保现有代码不中断
  3. 标记过时API:使用[Obsolete]特性提示开发者迁移到新API

实现细节

投影(Projection)相关改进

public abstract class ProjectionBase
{
    [Obsolete("请使用Name属性替代")]
    public string ProjectionName => Name;
    
    public string Name { get; protected set; }
    
    [Obsolete("请使用Version属性替代")] 
    public string ProjectionVersion => Version;
    
    public string Version { get; protected set; }
}

订阅(Subscription)相关改进

public abstract class SubscriptionBase
{
    [Obsolete("请使用Name属性替代")]
    public string SubscriptionName => Name;
    
    public string Name { get; protected set; }
    
    [Obsolete("请使用Version属性替代")]
    public string SubscriptionVersion => Version;
    
    public string Version { get; protected set; }
}

事件切片(IEventSlice)改进

同步对事件切片接口进行了类似优化:

public interface IEventSlice
{
    [Obsolete("请使用Snapshot属性替代")]
    object Aggregate => Snapshot;
    
    object Snapshot { get; }
}

开发者迁移指南

  1. 立即行动项

    • 编译器警告中提示的[Obsolete]属性应尽快处理
    • 将代码中的ProjectionName更新为Name
    • SubscriptionVersion更新为Version
  2. 兼容性保证

    • 旧属性仍会继续工作,但建议在新代码中使用统一命名
    • 过渡期结束后(通常2-3个主版本),旧属性可能会被移除

设计思考

这种演进方式体现了几个优秀实践:

  1. 平滑过渡:避免破坏性变更给开发者带来困扰
  2. 显式沟通:通过编译器警告明确指导迁移路径
  3. 命名简化:统一的核心属性名使API更加整洁
  4. 关注点分离:通过包装器属性保持单一职责原则

总结

Marten通过这种渐进式API演进策略,既改善了框架内部的一致性,又最大限度地降低了对现有用户的影响。这种模式值得在需要进行重大API变更的库开发中借鉴,它平衡了技术债务清理和用户体验保护的双重需求。开发者应当利用这个过渡期逐步更新代码,为未来的框架升级做好准备。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
143
1.91 K
kernelkernel
deepin linux kernel
C
22
6
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
192
273
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
927
551
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
421
392
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
145
189
金融AI编程实战金融AI编程实战
为非计算机科班出身 (例如财经类高校金融学院) 同学量身定制,新手友好,让学生以亲身实践开源开发的方式,学会使用计算机自动化自己的科研/创新工作。案例以量化投资为主线,涉及 Bash、Python、SQL、BI、AI 等全技术栈,培养面向未来的数智化人才 (如数据工程师、数据分析师、数据科学家、数据决策者、量化投资人)。
Jupyter Notebook
75
64
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
344
1.3 K
easy-eseasy-es
Elasticsearch 国内Top1 elasticsearch搜索引擎框架es ORM框架,索引全自动智能托管,如丝般顺滑,与Mybatis-plus一致的API,屏蔽语言差异,开发者只需要会MySQL语法即可完成对Es的相关操作,零额外学习成本.底层采用RestHighLevelClient,兼具低码,易用,易拓展等特性,支持es独有的高亮,权重,分词,Geo,嵌套,父子类型等功能...
Java
36
8