4A WebApi / ServiceHost / Plugin Loader 邊界分析
本文件整理第三階段完成後,進入第四階段前需要先釐清的正式執行入口邊界。
本文件只做邊界分析與後續決策依據,不代表已同意新增 ServiceHost 專案、WebApi 專案、API route、Plugin Loader、外部 DLL 載入、認證授權套件、背景服務套件、正式 DB DDL、正式 Apply、敏感連線資訊保存或既有 public method 簽章調整。
1. 分析定位
4A 的目的不是直接開始寫正式 Host 或 API,而是先把第三階段已完成的 Application contract 放到正式執行平台視角下檢查:
HS.DeviceControl.Application是否已足以作為未來 WebApi / ServiceHost 共用協調層。- WebApi 應該只負責 request / response、權限、DTO mapping 與轉交,不重寫 Workflow 或 Adapter 邏輯。
- ServiceHost 應該只負責背景執行生命週期、adapter lifecycle、health、log / trace 與任務協調,不提供 HTTP。
- Plugin Loader 應該先定義信任、版本、metadata 與載入停止線,不在未確認前載入外部 DLL。
- 第四階段若要進入現場工具、管理畫面或部署維運,必須先固定正式執行入口與安全邊界。
2. 目前基準
| 項目 | 目前狀態 |
| 文件 repo | main,第三階段線上驗收已完成 |
| 程式 repo | poc/nmodbus-tcp |
| 程式基準 commit | a158551 |
| 已完成階段 | 3A Trace 查詢、3B ManualApplyPreview、3C Application contract、3D Application contract |
| 測試基準 | Application tests 30 passed;solution tests 468 passed |
| 已存在共用層 | HS.DeviceControl.Core、HS.DeviceControl.Adapters、HS.DeviceControl.Application、HS.DeviceControl.Infrastructure.MySql |
| 尚未建立 | HS.DeviceControl.ServiceHost、HS.DeviceControl.WebApi、Plugin Loader、正式部署服務 |
3. 4A 邊界總表
| 邊界 | 可討論內容 | 目前停止線 |
| Application contract | 對外提供任務控制、設備狀態、Schema 預覽、Health、多設備單元、Resource Lock、Command Queue 與 Plugin metadata 的協調入口。 | 不修改既有 public method 簽章,不在未確認前新增破壞性契約。 |
| WebApi | 未來作為遠端查詢與控制入口,只做 HTTP request / response、權限、DTO mapping、錯誤回應與呼叫 Application service。 | 不新增 WebApi 專案、Controller、route、middleware 或 API response contract。 |
| ServiceHost | 未來作為正式背景執行入口,負責生命週期、adapter lifecycle、任務協調、health 與 log / trace。 | 不新增 ServiceHost 專案、不改啟動方式、不建立 Windows Service 或排程服務。 |
| Plugin Loader | 未來處理外部 DLL 信任、版本、metadata、載入與卸載策略。 | 不載入外部 DLL、不建立 loader、不執行外部程式碼。 |
| Plugin metadata | 可沿用 3D 的 PluginDescriptor / PluginRegistrationRequest 概念,先整理資料與狀態語意。 | 不把 metadata 等同於可執行 plugin,不建立檔案掃描或 assembly loading。 |
| DB / Schema | 可引用 3A / 3B / 第二階段既有查詢與安全預覽概念。 | 不執行 DDL / ALTER TABLE / 正式 Apply,不保存密碼或正式連線資訊。 |
| ConsoleHost | 可保留 PoC 與人工驗證入口經驗。 | 不把 ConsoleHost 直接升級成正式背景服務。 |
| UI / 現場工具 | 第四階段可再規劃現場工具與管理畫面。 | 4A 不新增 Web UI、WinForms Debug Tool 或多案場管理。 |
| 真實硬體 | 未來真實 Adapter 需遵守 Adapter contract 與 Application 協調層。 | 4A 不接真實硬體、不改 Adapter public contract。 |
4. 與 3C / 3D 的承接關係
3C 已先建立 Application Service contract,讓未來 WebApi / ServiceHost 不需要直接碰 Core、Adapter 或 DB gateway。
3D 已把多設備單元、資源鎖、命令佇列、Plugin metadata 與 Application error code 收斂到 Application 層,讓正式執行入口可以用同一組語意承接平台化能力。
因此 4A 的重點是判斷「正式入口如何包住 Application 層」,不是把流程邏輯搬到 Host、Controller 或 Plugin Loader。
5. 建議 4A 決策確認項目
| 編號 | 決策項目 | 建議方向 | 不同意時需說明 |
| 1 | 4A 只做邊界分析 | 本節點只建立邊界分析與決策確認表,不進入程式實作。 | 若要直接實作,需先指定是否建立 WebApi、ServiceHost 或其他正式入口,並確認風險。 |
| 2 | WebApi 邊界 | WebApi 第一版只做 HTTP 邊界、權限、DTO mapping、查詢與控制請求轉交。 | 若 WebApi 要直接呼叫 Core / Adapter / DB,需說明如何避免流程邏輯分散。 |
| 3 | ServiceHost 邊界 | ServiceHost 第一版只做背景執行生命週期、任務協調、adapter lifecycle、health 與 log / trace。 | 若 ServiceHost 要同時提供 HTTP,需說明部署、安全與責任切分。 |
| 4 | Plugin Loader 邊界 | 先保留 metadata / contract 層,不載入外部 DLL,待信任模型與版本策略確認後再實作。 | 若要立即載入 DLL,需先確認來源信任、簽章、版本、錯誤隔離與回復策略。 |
| 5 | Application 層作為共用協調層 | WebApi / ServiceHost / 現場工具都應透過 Application contract,不重寫 Workflow 或 Adapter 操作。 | 若各入口各自實作,需說明如何維護一致狀態、錯誤碼、Log 與測試。 |
| 6 | 部署與維運前置 | 在建立正式入口前,先確認設定來源、環境變數、health、log、operator、host name、app version 與敏感資訊保存方式。 | 若先建立入口再補維運規則,需接受後續返工與安全風險。 |
| 7 | 停止線維持 | 4A 不新增正式入口、不改 public method 簽章、不改 config schema、不執行 DB DDL、不接真實硬體。 | 若要突破停止線,需另開實作前確認與使用者明確同意。 |
6. 主要風險
| 風險 | 說明 | 4A 建議處理方式 |
| 過早新增 WebApi | 若權限、DTO、錯誤格式與任務控制語意未固定,容易把臨時設計變成外部契約。 | 先做決策確認表,再進入 API contract 草案。 |
| ServiceHost 與 WebApi 混責 | 背景執行與 HTTP 入口混在一起會讓部署、重啟、權限與錯誤處理難以切分。 | ServiceHost 不處理 HTTP,WebApi 不直接執行 Workflow。 |
| Plugin Loader 信任風險 | 外部 DLL 載入會牽涉版本、來源、簽章、隔離與錯誤回復。 | 先保留 metadata 與 registration 語意,不做 loader。 |
| 設定格式過早固定 | 入口一旦讀取正式 appsettings 或 plugin 設定,後續 schema 變更成本會提高。 | 4A 只列出需確認欄位,不改 config schema。 |
| DB 權限擴大 | 正式入口若直接帶入 DB 寫入或 DDL,會超出 3A / 3B 安全邊界。 | DDL、ALTER、正式 Apply 與密碼保存一律另行確認。 |
| Log 不一致 | 多入口若各自組錯誤與 Log,追蹤 Task / Node / Device / Command 會斷裂。 | 統一從 Application / Core result 與既有 log contract 轉換。 |
7. 4A 不做事項
- 不新增
HS.DeviceControl.ServiceHost專案。 - 不新增
HS.DeviceControl.WebApi專案。 - 不新增 Controller、route、middleware 或 API response contract。
- 不新增 Windows Service、背景排程、外部佇列或部署腳本。
- 不建立 Plugin Loader、不載入外部 DLL、不掃描 plugin 目錄。
- 不修改 Adapter public contract、不接真實硬體。
- 不修改 config schema、不保存敏感連線資訊。
- 不執行正式 DB 寫入、DDL / ALTER TABLE、正式 Apply。
- 不新增 Web UI、WinForms Debug Tool、多案場管理或報表。
8. 建議下一步
先整理「4A 決策確認表」,讓使用者逐項確認 WebApi、ServiceHost、Plugin Loader、Application 共用協調層、部署維運與停止線是否同意。
七項決策確認完成後,再決定要進入哪一條:
- WebApi contract 草案。
- ServiceHost contract 草案。
- Plugin Loader 信任模型與 metadata contract 草案。
- 第四階段現場工具 / 管理畫面前置規劃。