小节二:自己实现 SessionManager——创建、读取、恢复、关闭都从一个入口走

如果每个地方都直接操作:

SESSIONS[session_id]

很快会失控。

所以我们需要:

SessionManager

统一管理。

最基础支持:

create_session
get_session
restore_session
close_session
list_sessions
append_message
append_tool_history
add_run
update_working_memory

为什么不让业务代码直接改 Session?

例如:

session.status = "CLOSED"

当然能改。

但以后持久化以后:

内存对象改了
数据库没同步

就会出现一致性问题。

如果统一:

session_manager.close_session(...)

后面 SessionManager 内部可以同时:

更新内存
写数据库
写日志
更新 updated_at

调用方不用变。

这就是 Manager 层的价值。

把这个 Manager 层画出来,会更容易理解为什么不建议业务代码到处直接改 Session 对象:

图片[1]-小节二:自己实现 SessionManager——创建、读取、恢复、关闭都从一个入口走-大赛人网

调用方只认 SessionManager 这一套入口。当前底层可以只是一个 dict,以后换成 SQLite、MySQL、PostgreSQL 或 Redis,外层调用方式都不需要跟着重写;与此同时,updated_at、版本号、状态校验、日志和持久化也有了统一落点。

教学版为了让代码直观,get_session() 返回的还是内存对象本身,所以调用者技术上仍能直接修改它。我们把更新统一走 Manager,是在先建立正确使用习惯;生产实现通常会返回快照,或者把读写放进 Repository / 事务中,真正避免绕过版本、权限和持久化逻辑。

第一个版本先用内存存储

这一节先不引入 SQLite。

我们用:

dict

保存 Session。

这样重点放在会话模型。

后面第 22 节会真正做持久化。

完整可运行 SessionManager

这段程序已经跑通:

创建 Session
写消息
记录 Tool
关联 Run
关闭
恢复
继续追加

restore_session() 是什么意思?

这里的 restore 不是,从数据库恢复。

当前版本只是:

把 CLOSED Session 重新激活

以后持久化以后,它还会承担:

根据 session_id 从 Store 加载

这也是为什么我们先设计接口,后换存储。

读取历史 Session

用户界面常见需求:

最近会话

所以:

list_sessions()

通常按:

updated_at DESC

排序。

后面前端就可以显示:

今天 15:20  修复 Flask 项目
昨天 21:05  分析广告收入下降

关闭和删除不是一回事

这点要特别讲。

close_session():

会话结束
但历史还保留

delete_session():

数据真的删除

课程当前只实现 close。

因为关闭比删除更符合会话生命周期。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容