Jot动态配置ITrackingAware接口实现运行时跟踪任意对象【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/JotJot动态配置的核心在于ITrackingAware接口——它让 .NET 应用程序能够在运行时跟踪任意对象的状态而无需在编译期提前写死要持久化的属性。作为一款轻量的 .NET 状态持久化库Jot 的默认用法是按类型配置而ITrackingAware则把配置的主动权交给了对象自己让每个实例都能独立定制要保存的字段。本文面向新手用最少的代码带你彻底搞懂这个接口的用法与原理。为什么需要 ITrackingAwareJot 的常规工作方式是类型级配置你告诉 Tracker 某个类要跟踪哪些属性之后该类型的所有实例都按同一套规则执行例如 Demo/TestWPF/Services.cs 中配置窗口大小位置那样。但现实中的需求往往是动态的要跟踪的属性在编译期无法确定比如用户动态勾选要保存的字段不同实例需要跟踪不同的属性集合比如表格的列数不固定属性名需要拼接序号、索引等信息比如列0宽度、列1宽度这时候ITrackingAware接口就派上用场了——它提供了一条对象自己配置自己的通道。ITrackingAware 接口定义 接口本身极简只有一个方法定义在Jot/Configuration/ITrackingAware.cspublic interface ITrackingAware { void ConfigureTracking(TrackingConfiguration configuration); }只要你的类实现了这个接口Jot 在Track该对象时就会自动调用ConfigureTracking并把一份专属该实例的配置对象传进来。一探究竟Jot 运行时跟踪的完整流程 Jot 的整个流程可以用一张图概括步骤动作说明①Tracker.Track(obj)开始跟踪对象读取并应用已保存的状态②Configure(obj)查找该类型的跟踪配置③检查ITrackingAware若对象实现了该接口则复制一份配置并调用ConfigureTracking④应用旧数据把存储中的值写回对象属性⑤订阅事件监听触发事件如Closing自动持久化新数据其中第 ③ 步是关键它位于Jot/Tracker.cs的Configure(object target)方法中Jot 发现目标实现了ITrackingAware后会先复制该类型的基础配置避免污染类型级配置再把副本交给对象自行调整。这正是Jot动态配置的精髓——类型配置打底实例配置增强。实战运行时动态跟踪 DataGrid 列宽 来看一个经典场景窗体中有个 DataGrid我们希望每次启动都恢复用户调整过的列宽。列的数量是动态的无法用静态属性表达式搞定此时用ITrackingAware再合适不过public class MyFormWithDataGrid : Form, ITrackingAware { public void ConfigureTracking(TrackingConfiguration configuration) { // 运行时动态遍历每一列把列宽注册为跟踪属性 for (int i 0; i dataGridView1.Columns.Count; i) { var idx i; // 闭包陷阱必须捕获循环变量 string name grid_c_ dataGridView1.Columns[idx].Name; configuration.Property(name, f f.dataGridView1.Columns[idx].Width); } } }然后在窗体加载时调用Services.Tracker.Track(this)即可。每次启动程序Jot 都会自动把保存的列宽数据应用回来。代码量极小却解决了传统Settings文件难以处理的动态场景。动态配置的常用 API 速查 在ConfigureTracking方法中你可以使用TrackingConfiguration提供的全套能力方法作用示例Property(name, 表达式)动态注册单个属性可自定义存储名configuration.Property(w1, f f.col1.Width)Property(表达式, 默认值)注册属性并指定无数据时的默认值configuration.Property(f f.Age, 18)Properties(投影)一次注册多个属性configuration.Properties(f new { f.Left, f.Top })Id(函数)自定义存储标识避免多实例数据混淆configuration.Id(f f.Name)PersistOn(事件)指定触发持久化的事件configuration.PersistOn(nameof(Form.Closing))StopTrackingOn(事件)指定停止跟踪的事件configuration.StopTrackingOn(nameof(Form.Closed))AsGenericT()转换为强类型配置获得编译期检查configuration.AsGenericMyForm()数据默认通过JsonFileStore位于Jot/Storage/JsonFileStore.cs保存到%AppData%下的独立 JSON 文件中你也可以传入自定义的IStore实现把状态存到数据库或云端。三个新手必知的要点 实例级配置互不干扰每个对象的配置都是独立的副本同类型的不同实例可以有不同的跟踪属性不会相互覆盖。闭包陷阱要小心在循环中把索引i传入 Lambda 时务必先var idx i;捕获副本否则所有列都会跟踪最后一列。与类型配置协同实现了ITrackingAware的类仍会继承类型级配置比如基础窗体的大小位置跟踪ConfigureTracking里新增的属性是增量叠加。小结 ✨ITrackingAware是 Jot 面向动态场景的终极答案它把配置从编译期搬到运行时让对象自己决定持久化什么。结合 Jot 的Tracker与TrackingConfiguration你几乎可以跟踪任意对象的任意属性——表格列宽、用户偏好、插件状态都不在话下。项目还附带了 WPF 与 WinForms 的完整示例见Demo/TestWPF与Demo/TestWinForms配合 Jot.Tests/TrackerTests.cs 中的HonorITrackingAware测试用例照着敲一遍就能彻底掌握 Jot动态配置的用法。现在就去试试让状态持久化从此告别样板代码吧【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/Jot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考