Jot与IOC容器集成:一行代码自动跟踪容器创建的每个对象
【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/Jot
在.NET应用开发中,窗口大小、表单位置、用户偏好这类"状态"的保存与恢复,几乎是每个桌面应用都绕不开的重复劳动。Jot 就是一个专为 .NET 应用打造的轻量级状态持久化库:你只需声明要跟踪对象的哪些属性、在什么时机保存,剩下的读写逻辑全部交给它。而真正让开发者眼前一亮的是——当 Jot 与 IOC 容器集成后,仅需一行代码,就能自动跟踪容器创建的每一个对象,让状态管理彻底"隐形"。本文就带你从零上手 Jot,并掌握这套高效的 IOC 集成方案。
传统状态持久化为什么让人头疼?😩
回顾传统的.settings文件方案:以保存一个窗口的大小和位置为例,每个属性你至少要写 5 处——在设置文件中定义一次、构造函数中读取两次、关闭事件中写入两次。如果应用里有 10 个可调整大小的 UI 元素,设置文件很快就会变成一团乱麻,代码冗长且极易出错。
这正是 Jot 想要解决的痛点:它把"跟踪哪些属性"和"何时保存"抽象成声明式配置,让代码更简洁、意图更清晰。
Jot 是什么?.NET 状态持久化的优雅答案
Jot 是一个开源 .NET 库,通过 NuGet 一行命令即可安装:
install-package Jot它的核心只有一个概念:Tracker(跟踪器)。你为某种类型声明跟踪规则,然后对每个实例调用Track(),Jot 就会自动完成"应用已保存状态"和"监听事件以保存新状态"两个动作。核心源码可参考 Tracker.cs 和 TrackingConfiguration.cs。
Jot 三步入门:配置、跟踪、存储
第一步:为类型配置跟踪规则(通常在启动类中完成)
tracker.Configure<Window>() .Id(w => w.Name) .Properties(w => new { w.Top, w.Left, w.Width, w.Height, w.WindowState }) .PersistOn(nameof(Window.Closing));第二步:跟踪具体实例
tracker.Track(this); // 在窗口构造函数中调用第三步:选择存储位置
默认使用JsonFileStore,数据以 JSON 文件形式存放在%AppData%\[公司名]\[应用名]目录下,每个对象一个文件。你还可以实现简单的IStore接口,把数据存到数据库甚至云端。
Jot 与 IOC 容器集成:一行代码的魔法 ✨
在大型应用中,绝大多数对象都由 IOC 容器创建。Jot 巧妙利用了这一点:在容器初始化每个对象时,自动调用tracker.Track(),从而无需在每一个对象内部手动写跟踪代码。
以 SimpleInjector 为例,只需一行代码:
var tracker = new Jot.Tracker(); var container = new SimpleInjector.Container(); // 容器创建的每个对象,自动开始跟踪 container.RegisterInitializer(d => { tracker.Track(d.Instance); }, cx => true);这段代码做了三件事:
- 容器每创建一个对象,
RegisterInitializer回调立即触发; - Jot 根据该对象类型,自动查找预先配置的跟踪规则;
- 应用已保存的状态,并监听事件准备保存新状态。
从此,你只需要专注"配置哪种类型要跟踪哪些属性",而不必关心"何时、何地调用 Track"——容器全包了。Demo 中 WPF 工程的 Services.cs 和 MainWindow.xaml.cs 就展示了类似的跟踪配置方式。
其他 IOC 容器的集成思路 🔧
SimpleInjector 的RegisterInitializer只是其中一种实现,其他主流容器也提供了类似的钩子:
- Unity:使用
RegisterType的注入成员或OnDemand拦截器; - Autofac:利用
OnActivating事件,在实例激活时调用tracker.Track(e.Instance); - Microsoft.Extensions.DependencyInjection:自定义
ITypeActivator或工厂方法。
核心思路完全一致:在容器"创建完成对象"的钩子里,补上一句tracker.Track(instance)。
实际应用:WPF 与 WinForms 的窗口状态保存
Jot 最常见的应用场景就是保存窗口状态。针对不同 UI 框架,配置略有差异:
- WPF 窗口:跟踪
Top/Left/Width/Height/WindowState,在Closing事件时持久化,并把屏幕分辨率加入 Id,避免窗口被恢复到已拔掉的显示器上; - WinForms 窗体:需要在
OnLoad中跟踪(构造函数中设置Top/Left会被忽略),且要跳过最大化/最小化时的无效尺寸数据。
Demo 目录下的 TestWPF 和 TestWinForms 两个示例工程,提供了可直接运行的完整参考实现。
进阶技巧:属性级配置与继承复用
- 逐属性配置:
Property(p => p.Age, -1)可为属性指定默认值; - 继承复用:为基类配置的跟踪规则会自动复制到派生类,只需补充新增属性即可,例如为
MyForm额外跟踪tabControl.SelectedIndex; - 动态配置:实现
ITrackingAware接口(见 ITrackingAware.cs),可在运行时按实例灵活调整跟踪内容。
总结:让状态持久化回归简单
Jot 的价值在于把"状态持久化"从分散在各处的样板代码中解放出来,变成一处声明、全局生效。而Jot 与 IOC 容器集成则是这套理念的集大成者——一行代码自动跟踪容器创建的每个对象,之后任何对象的任何属性,只需修改跟踪配置即可持久化,既不用改业务代码,也不用担心遗漏。
如果你正在用 WPF、WinForms 或 Avalonia 构建 .NET 桌面应用,不妨试试这套"配置一次、全程托管"的状态持久化方案,把宝贵的时间留给真正的业务逻辑。🚀
【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/Jot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考