news 2026/8/21 13:37:06

Jot与IOC容器集成:一行代码自动跟踪容器创建的每个对象

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jot与IOC容器集成:一行代码自动跟踪容器创建的每个对象

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);

这段代码做了三件事:

  1. 容器每创建一个对象RegisterInitializer回调立即触发;
  2. Jot 根据该对象类型,自动查找预先配置的跟踪规则;
  3. 应用已保存的状态,并监听事件准备保存新状态。

从此,你只需要专注"配置哪种类型要跟踪哪些属性",而不必关心"何时、何地调用 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 13:32:46

SpringBoot+Vue中药实验管理系统毕业设计:从环境搭建到模块调试全攻略

这类毕业设计项目最值得关注的不是功能列表&#xff0c;而是如何把一个看似完整的“管理系统”拆解成可落地、可演示、可答辩的独立模块。很多同学拿到“中药实验管理系统”这样的题目&#xff0c;第一反应是去找现成源码&#xff0c;但真正决定你能否顺利通过的关键&#xff0…

作者头像 李华
网站建设 2026/8/21 13:28:28

从零手写KNN算法:鸢尾花分类实战与工程调优详解

最近在整理机器学习入门项目时&#xff0c;发现很多同学对KNN算法的理解停留在“找最近的K个邻居投票”这一步&#xff0c;一到自己动手写代码就卡壳&#xff0c;尤其是在距离计算、K值选择、数据归一化这些关键环节。本文将以一个完整的鸢尾花分类项目为例&#xff0c;从零开始…

作者头像 李华
网站建设 2026/8/21 13:22:48

基于Three.js与React构建3D家居编辑器:从架构到工程实践

在实际 3D 应用开发领域&#xff0c;从零开始构建一个功能完备的 3D 家居编辑器&#xff0c;涉及从底层渲染、交互逻辑到上层业务架构的完整知识栈。这不仅是前端图形学能力的体现&#xff0c;更是对工程化思维和复杂状态管理的深度考验。本文将以一个开源的大型 3D 家居编辑器…

作者头像 李华
网站建设 2026/8/21 13:19:46

开源推荐算法透明化实践:从黑盒调参到可解释性工程

上周&#xff0c;我花了一下午时间&#xff0c;试图为一个内部内容平台搭建一个简单的推荐模块。需求听起来很简单&#xff1a;根据用户的历史点击&#xff0c;在首页推送他们可能感兴趣的文章。我试了几个开源的推荐系统框架&#xff0c;它们功能强大&#xff0c;但配置复杂&a…

作者头像 李华
网站建设 2026/8/21 13:19:10

从数据拟合到工程实践:MATLAB/Python拟合进阶与不确定性分析

1. 从“拟合”到“拟合拓展”&#xff1a;一个工程师的实践视角如果你用过MATLAB的cftool&#xff0c;或者在Python里调过scipy.optimize.curve_fit&#xff0c;那你肯定对“拟合”不陌生。简单说&#xff0c;就是给你一堆散乱的数据点&#xff0c;你找一个数学公式去“描”出这…

作者头像 李华