“模块化单体 + DDD + 绞杀式迁移”,不要直接拆微服务或一次重写设备流程。这个项目是 WPF 工控测试系统,核心风险是安全、硬件时序与现场可恢复性,而不是项目文件数量。
当前最适合作为切入点的是工站域:已有 [状态机]、[命令邮箱]和 [操作日志]。但它们仍在 WPF 工程,且 20 个文件直接读写EnvironmentData.StationDatas,54 个文件使用静态Default/Instance入口,状态所有权尚未收敛。MaxWell.Models也混合了领域、CSV/数据库、配置和 WPF 可绑定模型,例如 Recipi 直接继承ObservableObject。测试与预测试类又达到 2,573 / 1,538 行,难以安全验证重构。
目标架构
WPF / Automation TCP / SECS-GEM | Application(命令、用例、流程编排) | Domain(规则、聚合、领域事件) | Infrastructure(SQLite、CSV、配置、日志、设备适配器) | 现有 PLC / 主控板 / 扫码枪 / RFID / EAP 驱动领域层不得引用 WPF、Dapper、SQLite、NLog、设备 DLL 或EnvironmentData。现有设备工程保留为基础设施适配器,不把寄存器、报文和 PLC 点位强行“领域化”。
建议划分以下限界上下文:
| 上下文 | 聚合与职责 |
|---|---|
| 工站运行 | Station:模式、生命周期、安全锁存、当前批次、版本号;状态转移唯一入口 |
| 批次追溯 | Batch:批号、工站、冻结的配方版本、治具快照、开闭批规则 |
| 产品流转 | UnitUnderTest:条码、位置、治具、Host 接收决定、流转状态 |
| 测试执行 | TestRun:预测试/正式测试、结果、失败原因;大量测量值采用追加式结果存储,不塞进大聚合 |
| 配方管理 | RecipeRevision:不可变、已版本化;开批后只能使用冻结版本 |
| 易损件与维护 | Consumable、寿命规则、到期联锁 |
| 主机集成 | Automation/SECS-GEM 仅做命令与事件翻译,通过防腐层隔离协议细节 |
AutomaticStationPipeline应定位为应用层 Process Manager:它协调异步硬件动作,不应成为领域实体。Station、Batch、TestRun负责“是否允许”,应用层负责“何时调用设备适配器”。
关键命令统一为OpenBatch、SubmitSot、AcceptHostItem、StartTest、FinishTest、UnloadUnit、CloseBatch、ResetStation。领域事件包括BatchOpened、UnitLoaded、HostItemAccepted、TestCompleted、SafetyInterlockTriggered、BatchClosed。UI、TCP 和 SECS/GEM 都只能调用同一组命令,不能再直接改工站状态。
持久化上不要立即使用 Event Sourcing。将现有StationOperationJournal演进为 SQLite 中的“操作检查点 + Outbox”即可:每个命令具备OperationId、聚合版本和幂等键;设备指令失败可重试;进程重启发现未完成操作时保持“需要人工确认/复位”,绝不自动续跑。这与当前安全策略一致。
12 周迁移计划
| 阶段 | 周期 | 交付物与验收 |
|---|---|---|
| 0. 业务建模与护栏 | 1 周 | 事件风暴、术语表、状态转移表、PLC/Host 时序图;为开批、停机、复位、结批建立特征测试 |
| 1. 建立边界 | 1 周 | 新建MaxWell.Domain、Application、Infrastructure、ArchitectureTests;编译期禁止 Domain 依赖 UI、数据库和设备 |
| 2. 工站与批次纵切 | 2 周 | 迁移OpenBatch/CloseBatch;Station和Batch成为唯一写入口;WPF 先通过适配器双读旧状态与新投影 |
| 3. 上料与主机协作 | 3 周 | 迁移SOT -> 扫码 -> Host 接收 -> 搬运;以UnitUnderTest替代依赖 ViewModel 的临时状态 |
| 4. 测试与结果 | 3 周 | 将预测试/正式测试拆为策略、规则和设备执行器;结果写入改为 Outbox 驱动的 CSV/SQLite 投影 |
| 5. 收口与下线 | 2 周 | 迁移易损件、配方冻结、恢复流程;删除新路径中的EnvironmentData写入与*.Default服务定位 |
实施顺序上,第一条生产纵切应选择“开批/结批”,不要先改停机、复位或急停。安全动作先保持现有硬件路径,并在动作完成后记录领域事实;待覆盖现场故障注入、断电恢复和并发命令测试后,再由应用层统一编排。
验收指标应明确为:UI 和协议层零直接写领域状态;每个状态转移有测试;同一工站命令可串行、跨工站可并行;重复 TCP/SECS 报文幂等;任一阶段异常退出后可识别在制品且不会自动误动作;配方、治具和测试结果可按批次版本完整追溯。