Jot钩子机制4个方法实现状态值转换与持久化取消【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/JotJot 是一个专为 .NET 应用设计的状态持久化库它通过一套强大的钩子机制Hook让开发者在不侵入业务代码的前提下灵活控制状态读取和状态写入两个环节。本文将为你拆解 Jot 钩子机制中最实用的 4 个方法手把手教你实现状态值转换与持久化取消无论是新手还是进阶用户都能快速上手。✨什么是 Jot 钩子机制为什么你需要它在传统写法中你要手动保存窗口位置、表单尺寸、用户偏好……然后在下次启动时再读回来代码又长又容易遗漏。Jot 帮你自动完成这一切而钩子机制就是那个中途拦截的入口。简单说Jot 的状态持久化有两条流水线应用状态Apply启动时把保存过的数据写回对象属性持久化状态Persist触发时机到来时把对象属性写入存储钩子就挂在两条流水线的每个环节上属性级每个属性读写前后和对象级整批操作完成前后。借助它们你可以把旧版本数据翻译成新格式状态值转换按条件跳过某些属性的保存持久化取消在操作完成后做额外处理日志、界面刷新等钩子机制的4个核心方法一张表看懂Jot 的钩子方法都通过Tracker.ConfigureT()返回的配置对象来注册调用方式高度统一。先看整体概览方法触发时机典型用途是否支持值转换是否支持取消WhenApplyingProperty读取数据、写回属性时兼容旧数据格式✅✅WhenPersistingProperty属性值写入存储时保存前清洗数据✅✅WhenAppliedState所有属性应用完成后界面刷新、通知❌❌WhenPersisted所有属性保存完成后日志记录、后续动作❌❌ 前两个方法作用于单个属性回调参数中包含PropertyOperationData后两个方法作用于整个对象回调参数就是目标对象本身。方法1WhenApplyingProperty——读取状态时的转换与拦截当 Jot 把存储中的旧数据写回对象时WhenApplyingProperty钩子会先过目每一个值。你可以修改pd.Value实现状态值转换也可以设置pd.Cancel true跳过这个属性。tracker.ConfigureFoo() .Id(f f.Id.ToString()) .Properties(f new { f.Age, f.Name }) .WhenApplyingProperty((f, pd) { // 状态值转换旧数据里 Age 单位是月新版本改成岁 if (pd.Property Age) pd.Value Convert.ToInt32(pd.Value) / 12; // 持久化取消跳过无效的旧数据 if (pd.Property Name string.IsNullOrEmpty(pd.Value?.ToString())) pd.Cancel true; }); tracker.Track(foo); // 启动追踪钩子自动生效应用场景程序升级后字段含义变化、存储中混入脏数据、需要按运行环境过滤旧配置……都在这一步搞定。核心实现见 TrackingConfiguration.cs。方法2WhenPersistingProperty——写入状态时的转换与拦截与上一个钩子方向相反WhenPersistingProperty在属性值即将写入存储之前触发是出口安检。同样支持状态值转换与持久化取消两个能力。tracker.ConfigureFoo() .Id(f f.Id.ToString()) .Properties(f new { f.Password, f.RememberMe }) .WhenPersistingProperty((f, pd) { // 状态值转换密码脱敏后入库 if (pd.Property Password) pd.Value Encrypt(pd.Value.ToString()); // 持久化取消用户没勾选记住我就不存密码 if (pd.Property Password !f.RememberMe) pd.Cancel true; }); tracker.Persist(foo); // 触发一次持久化应用场景敏感字段加密、空值过滤、按开关决定是否入库。测试用例中还有取消后保留旧值的细节——被取消的属性不会覆盖存储中的历史数据安全性更佳见 TrackerTests.cs。方法3WhenAppliedState——应用完成后的收尾通知当存储中的状态全部写回对象后WhenAppliedState钩子触发一次。它的回调参数是目标对象本身适合做加载完成之后的收尾工作。tracker.ConfigureForm1() .Property(f f.Location) .Property(f f.Size) .WhenAppliedState(f { f.Text 设置已恢复; // 恢复完成后通知用户 RefreshPanel(f); // 刷新依赖这些状态的界面 }); tracker.Track(form1);应用场景恢复窗口布局后重新排版、根据恢复的配置刷新菜单状态、埋点统计恢复成功事件。注册方式见 TrackingConfiguration.cs。方法4WhenPersisted——持久化完成后的动作回调与上一个钩子对称WhenPersisted在全部属性保存完成后触发是出口收尾钩子。适合记录保存日志、更新最近保存时间、或在保存后联动其他模块。tracker.ConfigureSettings() .Properties(s new { s.Theme, s.Language }) .WhenPersisted(s { Logger.Info($设置已保存于 {DateTime.Now}); UploadToCloud(s); // 保存后同步 }); tracker.Persist(settings);应用场景保存成功提示、增量同步、自动备份。完整实现见 TrackingConfiguration.cs。钩子的核心参数PropertyOperationData 三件套用好前两个属性级钩子的关键是理解PropertyOperationData它包含三个成员成员类型作用Propertystring只读当前被操作的属性名用于区分不同属性Valueobject可读写正在处理的值修改它即完成状态值转换Cancelbool可读写设为true即取消本次操作这个类型定义在 TrackingOperationEventArgs.cs所有属性级钩子都复用它学会一个就全会了。4个钩子怎么选一张决策清单想在读回时改数据 → 用WhenApplyingProperty做状态值转换想在保存时改数据 → 用WhenPersistingProperty做状态值转换想跳过某个属性的读取/保存 → 对应钩子里设pd.Cancel true实现持久化取消想做整批完成后的通知→ 用WhenAppliedState读完成或WhenPersisted写完成进阶提示泛型 API 更顺手Jot 同时提供了强类型泛型版本回调参数直接是目标类型无需手动转换代码更简洁定义在 TrackingConfigurationGeneric.cstracker.ConfigureFoo() .WhenPersistingProperty((Foo f, PropertyOperationData pd) { /* 强类型操作 */ });写在最后Jot 的钩子机制设计得相当克制4 个方法覆盖了状态持久化全流程的前、中、后三个节点配合PropertyOperationData的Value与Cancel属性就能优雅地实现状态值转换与持久化取消而不用改动任何业务代码。对于 .NET 桌面应用WPF / WinForms而言这几乎是管理应用状态的最省心方案。如果你想深入学习建议从Tracker入口Tracker.cs和TrackingConfigurationTrackingConfiguration.cs开始读源码测试文件 TrackerTests.cs 里还有大量可直接运行的示例边跑边看理解会更深。【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/Jot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考