3C Application Service contract 草案 / 實作前確認表
本文件承接 3C Service / API 邊界分析、3C Service / API 決策確認表 與 3C 程式 repo 結構檢查與實作前確認,把 Application Service contract 進入程式實作前需要確認的範圍、檔案、DTO、測試策略與停止線整理成可逐項確認的表格。
本文件原先只做 contract 草案與實作前確認。使用者已於 2026-06-04 確認七項決策,確認紀錄見 3C Application contract 決策確認紀錄。本次確認只授權進入 Application contract 第一版實作,不代表同意建立 ServiceHost / WebApi、新增 API route、導入套件、執行 DB 寫入、DDL 或正式 Apply。
0. 確認狀態
| 項目 | 內容 |
| 文件狀態 | 已確認 |
| 整理日期 | 2026-06-04 |
| 確認日期 | 2026-06-04 |
| 對應階段 | 第三階段 3C Service / API |
| 本次目標 | 已確認可進入 Application Service contract 第一版程式實作 |
| 本次不做 | 不改程式、不新增專案、不改 solution、不建 ServiceHost / WebApi、不新增 route、不導入套件 |
| 使用者回覆 | 3C Application contract 確認:1. 同意 ... 7. 同意 |
1. 第一版定位
Application Service 第一版的目標是建立 ServiceHost 與 WebApi 未來可以共用的協調層 contract,避免 Controller、Host 或 ConsoleHost 各自複製任務啟動、查詢、設備狀態與 schema preview 邏輯。
第一版建議只確認 contract / DTO / 測試骨架,不導入正式背景服務、HTTP API、認證授權、佇列、排程、正式 DB apply 或外部 DLL 載入。
| 原則 | 說明 |
| Application 層只做協調 | 不寫 Workflow node 邏輯、不直接操作硬體、不直接拼 SQL。 |
| Core 仍保持乾淨 | Core 不依賴 Application、WebApi、ServiceHost 或 UI。 |
| Adapter 仍是硬體邊界 | 設備狀態只能透過 IDeviceAdapter / Dispatcher 邊界取得。 |
| DB 仍走抽象 | Task / Trace 查詢應走 ITaskStore、ITaskTraceStore 等 contract。 |
| Preview 不等於 Apply | Schema preview 只回傳 ManualApplyPreview、風險與 PlanHash,不得 Apply。 |
2. 建議專案與引用方向
| 項目 | 建議 |
| 新增專案 | src/HS.DeviceControl.Application/HS.DeviceControl.Application.csproj |
| 新增測試專案 | tests/HS.DeviceControl.Application.Tests/HS.DeviceControl.Application.Tests.csproj |
| Target framework | net5.0,與既有專案一致 |
| Application 引用 | HS.DeviceControl.Core、HS.DeviceControl.Adapters |
| Application 不引用 | HS.DeviceControl.ConsoleHost、HS.DeviceControl.Infrastructure.MySql、未來 WebApi、未來 ServiceHost |
| 測試引用 | HS.DeviceControl.Application、必要時引用 Core / Adapters 測試替身 |
引用方向草案:
HS.DeviceControl.WebApi -> HS.DeviceControl.Application -> Core
HS.DeviceControl.ServiceHost -> HS.DeviceControl.Application -> Core
HS.DeviceControl.Application -> HS.DeviceControl.Adapters
HS.DeviceControl.Infrastructure.MySql -> Core
此方向代表 WebApi / ServiceHost 未來呼叫 Application Service,Application Service 再協調 Core / Adapter contract;WebApi 不直接操作 Adapter,ServiceHost 不重寫 Workflow node。
3. 第一版候選檔案
以下候選檔案已取得使用者七項決策確認,可作為下一步第一版程式實作範圍;仍不得擴大到 ServiceHost / WebApi。
| 類型 | 候選檔案 | 用途 |
| 專案 | src/HS.DeviceControl.Application/HS.DeviceControl.Application.csproj | Application Service contract 專案。 |
| Task contract | src/HS.DeviceControl.Application/Tasks/ITaskControlService.cs | 定義任務啟動、查詢、取消 contract。 |
| Task DTO | src/HS.DeviceControl.Application/Tasks/TaskStartRequest.cs | 建立任務請求。 |
| Task DTO | src/HS.DeviceControl.Application/Tasks/TaskStartResult.cs | 建立任務結果,至少包含 TaskId 與標準錯誤。 |
| Task DTO | src/HS.DeviceControl.Application/Tasks/TaskStatusQuery.cs | 查詢任務狀態條件。 |
| Task DTO | src/HS.DeviceControl.Application/Tasks/TaskStatusResult.cs | 任務狀態、時間、節點摘要與錯誤摘要。 |
| Task DTO | src/HS.DeviceControl.Application/Tasks/TaskCancelRequest.cs | 取消任務請求。 |
| Task DTO | src/HS.DeviceControl.Application/Tasks/TaskCancelResult.cs | 取消請求結果,不保證一定取消成功。 |
| Device contract | src/HS.DeviceControl.Application/Devices/IDeviceStatusService.cs | 定義 read-only 設備狀態查詢。 |
| Device DTO | src/HS.DeviceControl.Application/Devices/DeviceStatusQuery.cs | 設備狀態查詢條件。 |
| Device DTO | src/HS.DeviceControl.Application/Devices/DeviceStatusResult.cs | 設備狀態、最後錯誤與摘要。 |
| Schema contract | src/HS.DeviceControl.Application/Schema/ISchemaPreviewService.cs | 定義 schema preview contract。 |
| Schema DTO | src/HS.DeviceControl.Application/Schema/SchemaPreviewRequest.cs | Schema preview 請求。 |
| Schema DTO | src/HS.DeviceControl.Application/Schema/SchemaPreviewResult.cs | Schema preview 結果、風險、PlanHash、CanApply。 |
| Health contract | src/HS.DeviceControl.Application/Health/IHealthService.cs | 定義健康檢查摘要 contract。 |
| Health DTO | src/HS.DeviceControl.Application/Health/HealthStatusResult.cs | Host / DB / Adapter 健康摘要。 |
| 測試專案 | tests/HS.DeviceControl.Application.Tests/* | Contract / DTO / read-only 邊界測試。 |
4. Task Control contract 草案
| 方法 | 目的 | 第一版邊界 |
Start(TaskStartRequest request) | 建立任務請求,回傳 TaskId 或錯誤。 | 不阻塞等待完整 workflow 結束;不新增 queue;不建立 API route。 |
GetStatus(TaskStatusQuery query) | 查詢任務狀態與摘要。 | 只讀取 ITaskStore 或未來 read-side 來源。 |
Cancel(TaskCancelRequest request) | 提出取消請求。 | 需遵守 TaskStateMachine 終態規則;第一版可先定義 contract,不一定實作 runtime cancel。 |
第一版資料欄位建議:
| DTO | 欄位草案 |
TaskStartRequest | WorkflowId、RequestId、Operator、Source、RequestedAtUtc |
TaskStartResult | Success、TaskId、Status、Code、Message、Error |
TaskStatusQuery | TaskId、IncludeNodeHistory、Operator |
TaskStatusResult | Success、TaskId、WorkflowId、Status、StartedAt、EndedAt、TimeTakenMs、NodeCount、Error |
TaskCancelRequest | TaskId、Reason、Operator、RequestedAtUtc |
TaskCancelResult | Success、TaskId、Accepted、Status、Code、Message、Error |
5. Device Status contract 草案
Device Status 第一版只做 read-only,不下設備控制命令。
| 方法 | 目的 | 第一版邊界 |
GetStatus(DeviceStatusQuery query) | 查詢單一或多個設備狀態。 | 只呼叫狀態來源,不呼叫 Execute()。 |
欄位草案:
| DTO | 欄位草案 |
DeviceStatusQuery | DeviceId、IncludeLastError、Operator |
DeviceStatusResult | Success、DeviceId、Status、LastErrorCode、LastErrorMessage、CheckedAtUtc、Error |
6. Schema Preview contract 草案
Schema Preview 第一版只包裝既有 SchemaManualApplyPreviewBuilder / model,不提供 Apply。
| 方法 | 目的 | 第一版邊界 |
Preview(SchemaPreviewRequest request) | 產生 schema preview、風險與 PlanHash。 | CanApply 固定不可作為正式 Apply 授權;不執行 DDL。 |
欄位草案:
| DTO | 欄位草案 |
SchemaPreviewRequest | TargetSchemaName、CorrelationId、Source、Operator |
SchemaPreviewResult | Success、PlanHash、CanApply、DdlExecutionAllowed、Items、Warnings、Error |
7. Health contract 草案
Health 第一版只回傳摘要,不暴露敏感資訊。
| 方法 | 目的 | 第一版邊界 |
GetStatus() | 回傳 Application / dependency 健康摘要。 | 不回傳密碼、Token、完整 connection string 或內部 exception stack trace。 |
欄位草案:
| DTO | 欄位草案 |
HealthStatusResult | Success、Status、CheckedAtUtc、Dependencies、Error |
HealthDependencyStatus | Name、Status、Message、CheckedAtUtc |
8. 測試策略
| 測試 | 目的 | 邊界 |
| Application project compile | 確認新增專案、引用方向與 solution 結構正確。 | 不代表 ServiceHost / WebApi 已完成。 |
| Task DTO validation | 確認 WorkflowId、TaskId、Operator 等必要欄位規則。 | 不啟動真實 workflow。 |
| Task status query mapping | 確認 task record 可轉成 status result。 | 使用 fake / in-memory 資料,不連 DB。 |
| Cancel contract | 確認終態任務不可被視為可取消。 | 不代表 runtime cancellation 已完成。 |
| Device Status read-only | 確認 DeviceStatus service 不呼叫 Execute()。 | 不下設備控制命令。 |
| Schema Preview no apply | 確認 preview result 不開放 Apply。 | 不執行 DDL。 |
| Health sensitive masking | 確認健康檢查不暴露密碼或完整 connection string。 | 不導入正式認證授權。 |
9. 七項確認表
使用者已逐項確認,可進入第一版 Application contract 程式實作:
| 編號 | 決策項 | 定案結果 | 實作影響 |
| 1 | 新增 Application 專案 | 同意新增 HS.DeviceControl.Application 與 HS.DeviceControl.Application.Tests | 可建立 ServiceHost / WebApi 共用協調層。 |
| 2 | 引用方向 | 同意 Application 只引用 Core / Adapters,不引用 ConsoleHost / Infrastructure.MySql / WebApi / ServiceHost | 維持協調層不綁特定 Host 或 DB implementation。 |
| 3 | 第一版範圍 | 同意第一版只做 contract / DTO / 最小測試,不建 WebApi / ServiceHost | 降低 public contract 與啟動方式變更風險。 |
| 4 | Task Control 模式 | 同意 Start 回傳 TaskId,GetStatus 查狀態,Cancel 只提出取消請求 | 避免長時間工作阻塞 API,保留未來 queue 空間。 |
| 5 | Device Status 邊界 | 同意第一版只讀設備狀態,不下控制命令 | 避免 API 繞過 Task / Adapter 邊界直接控硬體。 |
| 6 | Schema Preview 邊界 | 同意只包裝 ManualApplyPreview,不 Apply、不 DDL | 可提供管理檢查,但不動 DB。 |
| 7 | 停止線 | 同意不新增 route、不導入套件、不改啟動方式、不保存 secret | 保持本批為最小 contract 起點。 |
已確認回覆:
3C Application contract 確認:
1. 同意
2. 同意
3. 同意
4. 同意
5. 同意
6. 同意
7. 同意
10. 仍需停止的項目
即使七項全部同意,除非使用者另行明確授權,仍不得自動執行:
- 不新增
ServiceHost專案。 - 不新增
WebApi專案。 - 不新增 API route、controller、endpoint 或 middleware。
- 不新增或更換認證授權、佇列、背景服務、Web framework 套件。
- 不修改既有 Core / Adapter / Infrastructure public method 簽章。
- 不執行 DB 寫入、DDL、ALTER TABLE 或正式 Apply。
- 不保存密碼、Token、完整 connection string 或正式環境資訊。
- 不改程式啟動方式。
- 不導入外部 DLL、Plugin Loader 或真實硬體控制。
11. 建議下一步
七項決策已確認,可進入「3C Application Service contract 第一版實作」。第一版仍應限制在 Application project、contract / DTO、測試專案與文件紀錄,不建立 ServiceHost / WebApi。