Files
stgsharp/StgSharp.UserInterface/VSS_Arch.md
T

313 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# VSS 架构设计文档
> **作者**:Nitload-NSI
> **创建日期**:2026-03-17
> **所属项目**:StgSharp 框架 / 工业上位机架构预演
> **文档状态**:精简版草案
---
## 1. 文档定位
本文档用于说明 VSS 的整体架构思想、三层职责划分与层间关系。
具体类型定义、命名与边界,以《VSS 三层类型基座设计草案》为准。
当前版本需要特别强调一点:
State 层不再被描述为几个并列的中枢对象,而是对外统一表现为一个单例 `StateHost`。
---
## 2. 设计评估
把整个 State 层对外收敛为 `StateHost` 单例,是比旧描述更合理的做法。
原因有三点:
- 它明确了唯一中枢,避免旧版文档中的多个中枢概念同时被读成并列核心。
- 它明确了所有权,说明命令接入、状态抽象和服务管理都属于同一个运行时边界。
- 它更符合宿主型系统的实际组织方式,对外暴露一个主机,对内再展开结构,比暴露多个概念性中枢更稳定。
这个设计也有一个边界需要保留:
虽然 `ServiceManager` 现在被放入 `StateHost` 的下层,但这并不意味着状态与能力本体被混为一层。
`AppState` 仍然是状态抽象,`ServiceManager` 仍然只是服务管理结构,具体服务对象依然属于能力层。
另外,前侧命令链路只定义命令而不定义结果也是不完整的。
如果 `FrontCommandHost` 已经区分 `StateChangeCommand` 与 `ExecuteCommand`,那么还必须存在统一的 `CommandResult`,用于把执行完成状态回传给 View。
---
## 3. 架构总览
VSS 当前建议的核心结构如下:
View / Electron / HMI / 外设 / 其他宿主
↓
StateHost(单例)
├─ 上层:FrontCommandHost
├─ 中层:AppState
└─ 下层:ServiceManager
↓
Service / ServiceHost / 具体能力实例
这个结构表达的是:
1. 对外,State 层只有一个统一入口,即 `StateHost`。
2. 对内,`StateHost` 全息展开为上中下三层。
3. 服务能力通过 `ServiceManager` 被纳入统一调度,而不是直接散落在外部结构中。
其基本流程可以概括为:
1. 外部宿主产生交互或控制请求。
2. 请求进入 `StateHost`。
3. `StateHost` 的上层 `FrontCommandHost` 接收并区分 `StateChangeCommand` 与 `ExecuteCommand`。
4. `StateHost` 的中层 `AppState` 参与状态判断与状态更新。
5. 当命令涉及能力执行时,`StateHost` 的下层 `ServiceManager` 负责调度服务。
6. 命令处理完成后,`StateHost` 统一生成 `CommandResult` 回传给 View。
7. 状态变化与结果通知分别承担状态同步和执行完成通知两类职责。
---
## 4. View 层
### 4.1 定位
View 层是前侧交互来源的统一抽象。
它不等同于传统窗口或页面,而是所有外部交互入口与宿主环境的集合。
View 层只负责两件事:
- 承接交互
- 将交互转化为命令并送入 `StateHost`
同时,View 还需要能够接收由 `StateHost` 回传的 `CommandResult`,从而知道某次执行型命令是否已经完成。
它不再承担中枢职责,也不直接持有服务调度责任。
### 4.2 基础类型
#### ViewHost
`ViewHost` 是前侧宿主的统一抽象,用于表示任何可以承接界面表现、输入来源或外部交互来源的宿主对象。
#### StateChangeCommand
`StateChangeCommand` 用于表达对系统状态的直接修改请求。
#### ExecuteCommand
`ExecuteCommand` 用于表达需要进入执行流程的命令请求。
#### CommandResult
`CommandResult` 用于表达某次前侧命令处理完成后的统一结果通知。
### 4.3 小结
View 层的职责不是承载业务逻辑,而是把复杂、多样、异构的交互来源收敛成稳定命令,然后统一送入 `StateHost`。
对于执行类命令,View 不能只依赖状态变化判断是否结束,还应通过 `CommandResult` 获得明确的完成通知。
---
## 5. State 层
### 5.1 定位
State 层是 VSS 的唯一状态与调度中枢。
它对外统一表现为 `StateHost` 单例,对内展开为三层结构。
### 5.2 内部结构
#### StateHost
`StateHost` 是 State 层唯一对外暴露的运行时主机。
它负责:
- 接收来自外部宿主的命令
- 统一组织命令接入、状态抽象和服务管理
- 统一处理状态同步、事件广播、服务结果回流和 `CommandResult` 回传
#### 上层:FrontCommandHost
`FrontCommandHost` 是 `StateHost` 的上层,用于承接前侧命令输入。
它属于 State 内部结构,不再被视为 View 层自己的中介中心。
在命令协议上,`FrontCommandHost` 至少要面对两类前向命令:
- `StateChangeCommand`
- `ExecuteCommand`
对应地,State 在处理完成后还需要回传统一的 `CommandResult`。
#### 中层:AppState
`AppState` 是 `StateHost` 的中层状态抽象,是全局状态树根。
它代表状态本体,而不是状态宿主。
#### 下层:ServiceManager
`ServiceManager` 是 `StateHost` 的下层服务管理结构。
它负责把命令向下转化为具体能力调度,并将结果回流状态体系。
#### 配套结构
State 层还包括:
- `PanelState`,用于表示局部状态单元
此外,observer 语义仍然存在,但在 `StgSharp.UserInterface` 中不再通过 `OnStateChanged` / `StateChangeObserver` 这类手写公共类型表达。
这里更准确的说法是:状态写入后的轻量 observer 逻辑,改为由源生成器围绕具体状态节点直接分布式织入。
在传统 MVVM 中,observer 往往同时承担:
- 内部逻辑回调
- VM 内部广播变化
- 通知 View 重绘
- 通知 Data / 业务执行
而在 VSS 中,这四项职责被拆开处理:
- 内部逻辑回调:由 Service 或具体业务实现承担
- VM 内部广播变化:由源生成器生成的轻量 observer hook 承担
- 通知 View 重绘:由 command/result 与同步符号链路承担
- 通知 Data / 业务执行:由 command/result 与 service 调度承担
其中 `CommandResult` 仍用于通知某次命令已经处理完成。
### 5.3 小结
State 层现在应被理解为一个统一主机,而不是多个同级中心。
`StateHost` 对外是单例边界,对内则由 `FrontCommandHost`、`AppState` 和 `ServiceManager` 三层共同构成。
---
## 6. Service 层
### 6.1 定位
Service 层仍然是系统能力的承载层,但其管理入口已经被明确收敛到 `StateHost` 的下层 `ServiceManager`。
因此,Service 层关注的重点是:
- 被调度的具体服务对象
- 服务装载与完成事件
- 服务运行宿主与能力实例
Service 内部完成事件可以回流到 `StateHost`,但前侧最终接收到的仍应是统一的 `CommandResult`,而不是直接暴露服务内部事件。
### 6.2 基础类型
#### ServiceLoadCommand
`ServiceLoadCommand` 用于表达服务装载请求。
#### ServiceLoadAccomplishmentEvent
`ServiceLoadAccomplishmentEvent` 用于表达服务装载完成后的结果通知。
#### ServiceHost
`ServiceHost` 用于表达某一类服务实例的直接宿主或执行载体。
### 6.3 小结
`ServiceManager` 属于 State 的下层管理结构,而 `ServiceHost` 与具体服务实例才属于能力层主体。
这样可以在统一调度和能力解耦之间保持清晰边界。
---
## 7. 层间关系
### 7.1 View → State
View 层通过命令把交互送入 `StateHost`。
命令首先由 `FrontCommandHost` 接入,再由 `StateHost` 统一协调后续动作。
当前前侧协议至少应包含:
- `StateChangeCommand`
- `ExecuteCommand`
- `CommandResult`
### 7.2 State 内部关系
State 内部的关系是:
- 上层 `FrontCommandHost` 负责接命令
- 中层 `AppState` 负责持状态
- 下层 `ServiceManager` 负责管服务
三者共同组成一个统一的 State 运行时主机。
### 7.3 State → Service
当命令涉及能力执行时,`StateHost` 通过下层 `ServiceManager` 调度服务对象。
服务执行结果再统一回流 `StateHost`,由其决定状态更新与通知广播。
对于 View 而言,某次执行是否完成,应以 `CommandResult` 为准,而不是直接依赖服务内部事件。
---
## 8. 与 MVVM 的区别
相较于 MVVM,VSS 更强调统一运行时主机,而不是围绕界面绑定建立系统中心。
主要区别在于:
- MVVM 通常以界面和 ViewModel 配合为中心,VSS 以 `StateHost` 为唯一中枢
- MVVM 更适合界面驱动型应用,VSS 更适合多输入源、多宿主、强状态调度的软件
- VSS 明确区分状态本体、命令接入和服务管理,但又把它们统一收束在同一个 State 边界内
---
## 9. 适用场景
VSS 更适合以下场景:
- 工业上位机
- 多输入源 HMI
- 仿真与控制软件
- 支持无头运行的软件
- 需要多宿主接入的系统
对于纯数据展示、轻量表单或前端页面驱动型应用,MVVM 仍可能是更直接的选择。
---
## 10. 当前建议保留的最小类型清单
### View 层
- `ViewHost`
- `StateChangeCommand`
- `ExecuteCommand`
- `CommandResult`
### State 层
- `StateHost`
- `FrontCommandHost`
- `AppState`
- `PanelState`
- `ServiceManager`
### Service 层
- `ServiceLoadCommand`
- `ServiceLoadAccomplishmentEvent`
- `ServiceHost`
---
## 11. 结论
VSS 的重点不在于先定义某一种具体界面实现,而在于先定义稳定的运行时骨架。
在当前阶段,更准确的表达应当是:
- View 层负责交互来源
- State 层对外统一表现为 `StateHost` 单例
- `StateHost` 对内全息展开为 `FrontCommandHost`、`AppState`、`ServiceManager` 三层
- 前侧命令协议由 `StateChangeCommand`、`ExecuteCommand`、`CommandResult` 构成闭环
- Service 层负责承载被调度的具体能力对象
这一定义比旧版本更清楚地表达了唯一中枢、运行时边界和内部层次关系。