跳至主要内容

GST Framework Guide

適用對象:新進開發人員、需要了解底層架構的工程師 前置知識:C#、.NET 8、MVVM Pattern 基礎 預計閱讀時間:60 分鐘(完整閱讀)/ 10 分鐘(快速開始) 最後更新:2026-01-18 版本:1.0.0


學習目標

完成本指南後,你將能夠:

  • 理解 GST Framework 的分層架構和設計理念
  • 知道各 Layer 的職責和模組組成
  • 能夠在正確的位置新增功能或修改程式碼
  • 了解 Plugin 系統的運作方式
  • 遵循 GST 命名規範和開發標準

目錄

  1. 快速開始(10 分鐘)
  2. 架構總覽
  3. Core Layer 詳解
  4. Plugin Layer 詳解
  5. Protocols Layer 詳解
  6. UI Layer 詳解
  7. Application Layer 詳解
  8. 開發流程與規範
  9. 常見問題 FAQ
  10. 相關資源

1. 快速開始

1.1 專案結構一覽

D:\WorkSpace\GatherTech\Core\GST-develop\
├── src/
│ ├── Core/ # 核心層(穩定,少變動)
│ │ ├── GST.Core.Abstractions/ # Interface 定義
│ │ ├── GST.Core.Common/ # 共用工具
│ │ ├── GST.Core.Communication/ # 通訊抽象
│ │ ├── GST.Core.Configuration/ # 配置管理
│ │ ├── GST.Core.Logging/ # 日誌系統
│ │ └── GST.Core.Plugin/ # Plugin 載入器
│ │
│ ├── Plugins/ # Plugin 層(功能模組)
│ │ ├── GST.Plugin.Modbus/ # Modbus 通訊
│ │ ├── GST.Plugin.UserManagement/
│ │ ├── GST.Plugin.AuditTrail/
│ │ ├── GST.Plugin.Alarm/
│ │ └── ... (更多 Plugin)
│ │
│ ├── Protocols/ # 協定層(常數與模型)
│ │ └── GST.Protocols.SMB/ # SMB 設備協定
│ │
│ └── UI/ # UI 層
│ ├── GST.UI.Abstractions/ # UI 抽象
│ └── GST.UI.Wpf/ # WPF 支援

└── tests/ # 測試專案
└── GST.*.Tests/

1.2 第一個專案:引用 GST Framework

<!-- YourProject.csproj -->
<ItemGroup>
<!-- 必要:Core 抽象 -->
<ProjectReference Include="...\GST.Core.Abstractions\GST.Core.Abstractions.csproj" />

<!-- 選用:根據需求引用 -->
<ProjectReference Include="...\GST.Core.Common\GST.Core.Common.csproj" />
<ProjectReference Include="...\GST.Plugin.UserManagement\GST.Plugin.UserManagement.csproj" />
</ItemGroup>

1.3 DI 註冊範例

// Program.cs 或 App.xaml.cs
public void ConfigureServices(IServiceCollection services)
{
// Core 服務
services.AddGstLogging();
services.AddGstConfiguration();

// Plugin 服務
services.AddUserManagement(options =>
{
options.PasswordPolicy.MinLength = 8;
options.SessionTimeout = TimeSpan.FromMinutes(30);
});

services.AddAuditTrail(options =>
{
options.EnableHashChain = true;
});
}

2. 架構總覽

2.1 分層架構圖

┌─────────────────────────────────────────────────────────────────┐
│ Application Layer │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ GST.App.* │ │ Jope.* │ │ Leyu.* │ │
│ │ (通用應用) │ │ (喬璞專案) │ │ (樂宇專案) │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────────┐
│ UI Layer │
│ ┌─────────────────────────┐ ┌─────────────────────────────┐ │
│ │ GST.UI.Abstractions │ │ GST.UI.Wpf │ │
│ │ (UI 抽象) │ │ (WPF MVVM 支援) │ │
│ └─────────────────────────┘ └─────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────────┐
│ Plugin Layer │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Modbus │ │ User │ │ Audit │ │ Alarm │ ... │
│ │ Plugin │ │ Mgmt │ │ Trail │ │ Plugin │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────────┐
│ Core Layer │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Abstractions │ │ Common │ │ Communication│ │
│ │ (Interface) │ │ (Utilities) │ │ (Transport) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Configuration│ │ Logging │ │ Plugin │ │
│ │ (Settings) │ │ (Serilog) │ │ (Loader) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────────┐
│ Protocols Layer │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ GST.Protocols.SMB (常數、Enum、Specification、Model) │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

2.2 設計原則

原則說明
依賴反轉上層依賴抽象(Interface),不依賴具體實作
單一職責每個 Module 只負責一件事
開放封閉對擴展開放,對修改封閉(透過 Plugin 擴展)
介面隔離Interface 小而專一,避免胖介面

2.3 專案命名規範

類型格式範例
Framework 核心GST.Core.{Module}GST.Core.Abstractions
Framework PluginGST.Plugin.{Feature}GST.Plugin.UserManagement
Framework UIGST.UI.{Technology}GST.UI.Wpf
協定定義GST.Protocols.{Domain}GST.Protocols.SMB
通用應用GST.App.{ProjectName}GST.App.ProcessVision
公司專屬{Company}.{ProjectName}Jope.SMB.Core

3. Core Layer 詳解

位置D:\WorkSpace\GatherTech\Core\GST-develop\src\Core\

Core Layer 是整個 Framework 的基石,提供所有 Interface 定義和基礎設施。

3.1 GST.Core.Abstractions

用途:定義所有 Interface,是唯一被所有專案引用的模組。

GST.Core.Abstractions/
├── Communication/
│ ├── ICommunicationChannel.cs # 通訊 Channel 抽象
│ ├── ITransport.cs # 傳輸層抽象
│ ├── ICommandQueue.cs # 命令佇列
│ └── IProtocol.cs # 協定抽象
├── Services/
│ ├── IUserService.cs # 使用者服務
│ ├── IAuditTrailService.cs # Audit Trail 服務
│ └── IAlarmService.cs # 警報服務
└── ...

設計原則

  • 只定義 Interface,不包含實作
  • 不依賴任何其他專案(零依賴)
  • 變動頻率最低

3.2 GST.Core.Communication

用途:提供通訊抽象,支援重試、熔斷、自動重連。

// ICommunicationChannel 使用範例
public class MyDevice
{
private readonly ICommunicationChannel _channel;

public async Task SendCommandAsync(byte[] command)
{
// 自動處理:重試、熔斷、佇列
var response = await _channel.Transport.SendAndReceiveAsync(command);
}
}

主要元件

元件職責
ITransport傳輸層(Serial、TCP、UDP)
ICommandQueue命令優先級佇列
ICommunicationChannel整合 Transport + Queue + 重試

3.3 GST.Core.Common

用途:共用工具類別,提供跨模組共用的基礎功能。

GST.Core.Common/
├── Caching/ # 快取服務
│ ├── MemoryCacheService.cs # 記憶體快取實作
│ └── DefaultCacheKeyGenerator.cs
├── Exceptions/ # 自訂異常
│ ├── GstException.cs # 基礎異常類別
│ ├── CommunicationException.cs
│ ├── ConfigurationException.cs
│ └── PermissionException.cs
├── Extensions/ # 擴展方法
│ ├── StringExtensions.cs
│ ├── TaskExtensions.cs
│ └── CollectionExtensions.cs
├── Guards/ # 參數驗證
│ └── Guard.cs
├── Helpers/ # 工具類別
│ ├── AsyncLock.cs # 非同步鎖
│ ├── RetryHelper.cs # 重試機制
│ ├── DisposableHelper.cs
│ └── SingleInstanceGuard.cs # 單一執行個體保護
├── Results/ # Result Pattern
│ ├── Result.cs # 操作結果封裝
│ ├── Error.cs # 錯誤定義
│ └── LocalizableError.cs # 可本地化錯誤
└── TimeSync/ # NTP 時間同步(FDA Part 11)
├── NtpTimeSyncService.cs # NTP 同步服務
├── TimeSyncHostedService.cs
└── TimeSyncOptions.cs

Result Pattern 使用範例

// 服務方法返回 Result
public async Task<Result<User>> GetUserByIdAsync(Guid id)
{
var user = await _repository.FindAsync(id);
if (user is null)
return Error.NotFound("User.NotFound", $"User {id} not found");

return user;
}

// 呼叫端處理
var result = await userService.GetUserByIdAsync(userId);
if (result.IsSuccess)
{
var user = result.Value;
// 處理成功情況
}
else
{
var error = result.Error;
// 處理錯誤情況
}

3.4 GST.Core.Configuration

用途:配置管理,支援 JSON、環境變數、命令列參數。

DI 註冊

services.AddGstConfiguration(options =>
{
options.AddJsonFile("appsettings.json");
options.AddEnvironmentVariables();
});

3.5 GST.Core.Logging

用途:日誌系統,基於 Serilog,支援結構化日誌。

DI 註冊

services.AddGstLogging(options =>
{
options.MinimumLevel = LogLevel.Information;
options.EnableConsole = true;
options.EnableFile = true;
options.LogPath = "logs/app.log";
});

3.6 GST.Core.Plugin

用途:Plugin 動態載入機制,支援熱插拔。

主要元件

元件職責
IPluginPlugin 介面定義
PluginLoader動態載入 Plugin DLL
PluginOptions載入選項配置

DI 註冊

services.AddGstPlugins(options =>
{
options.PluginPath = "plugins/";
options.IsParallelLoadingEnabled = false; // 預設循序載入
});

4. Plugin Layer 詳解

位置D:\WorkSpace\GatherTech\Core\GST-develop\src\Plugins\

Plugin Layer 提供可插拔的功能模組。

4.1 Plugin 清單

Plugin用途FDA Part 11
GST.Plugin.ModbusModbus RTU/TCP 通訊-
GST.Plugin.UserManagement使用者帳號管理
GST.Plugin.AuditTrail操作記錄追蹤
GST.Plugin.ElectronicSignature電子簽章
GST.Plugin.Alarm警報管理-
GST.Plugin.Localization多國語言-
GST.Plugin.Export資料匯出-
GST.Plugin.FileStorage檔案儲存(Hash Chain)
GST.Plugin.TimeSyncNTP 時間同步
GST.Plugin.SessionIdle閒置自動登出

4.2 Plugin 使用範例

// DI 註冊
services.AddUserManagement(options =>
{
options.PasswordPolicy.MinLength = 8;
options.PasswordPolicy.RequireUppercase = true;
options.PasswordPolicy.HistoryCount = 5;
});

// 使用服務
public class LoginViewModel
{
private readonly IUserService _userService;

public async Task<bool> LoginAsync(string username, string password)
{
var result = await _userService.AuthenticateAsync(username, password);
return result.IsSuccess;
}
}

4.3 GST.Plugin.AuditTrail(FDA Part 11 合規)

用途:操作記錄追蹤,支援 Hash Chain 完整性驗證。

主要介面

public interface IAuditService
{
// 記錄使用者操作
Task LogUserActionAsync(
AuditAction action,
string description,
string? entityType = null,
string? entityId = null,
object? metadata = null,
CancellationToken cancellationToken = default);

// 記錄資料變更(含新舊值)
Task LogDataChangeAsync(
AuditAction action,
string entityType,
string entityId,
string description,
object? oldValues = null,
object? newValues = null,
CancellationToken cancellationToken = default);

// 記錄系統事件
Task LogSystemEventAsync(
AuditAction action,
string description,
AuditResult result = AuditResult.Success,
object? metadata = null,
CancellationToken cancellationToken = default);

// 查詢 Audit 記錄
Task<IReadOnlyList<AuditEntry>> QueryAsync(
AuditQueryOptions options,
CancellationToken cancellationToken = default);

// 匯出 Audit 記錄
Task<byte[]> ExportToCsvAsync(AuditQueryOptions options, CancellationToken ct = default);
Task<byte[]> ExportToExcelAsync(AuditQueryOptions options, CancellationToken ct = default);

// FDA 合規:歸檔而非刪除
Task<int> ArchiveAsync(DateTime olderThan, string archivePath, CancellationToken ct = default);
}

DI 註冊

services.AddAuditTrail(options =>
{
options.EnableHashChain = true; // 啟用 Hash Chain
options.ShouldPreventDeletion = true; // 禁止刪除(FDA 合規)
options.RetentionDays = 365 * 7; // 保留 7 年
});

使用範例

public class RecipeService
{
private readonly IAuditService _auditService;

public async Task UpdateRecipeAsync(Recipe recipe, Recipe oldRecipe)
{
// 更新邏輯...

// 記錄變更
await _auditService.LogDataChangeAsync(
AuditAction.Update,
entityType: "Recipe",
entityId: recipe.Id.ToString(),
description: "Recipe parameters updated",
oldValues: oldRecipe,
newValues: recipe);
}
}

4.4 其他 FDA Part 11 Plugin

Plugin用途關鍵功能
GST.Plugin.UserManagement帳號管理密碼策略、密碼歷史、帳號鎖定
GST.Plugin.ElectronicSignature電子簽章雙重驗證、簽章圖片儲存
GST.Core.FileStorage檔案儲存Hash Chain、WAL Buffer
GST.Core.Common.TimeSync時間同步NTP 同步、時間偏移監控

5. Protocols Layer 詳解

位置D:\WorkSpace\GatherTech\Core\GST-develop\src\Protocols\

Protocols Layer 定義設備通訊協定的常數和模型。

5.1 設計原則

重要:僅共用常數和模型,不共用編碼/解碼邏輯。

App 和 Simulator 的關係:
┌─────────────────┐ ┌─────────────────┐
│ App (Master) │ 通訊 │ Simulator (Slave)│
│ 獨立實作協定 │ ←────→ │ 獨立實作協定 │
└─────────────────┘ └─────────────────┘
│ │
└───── 交叉驗證正確性 ───────┘
類別是否共用原因
協定常數 (STX, ETX, PFC)✅ 共用純定義
設備 ID✅ 共用純常數
資料模型✅ 共用純資料結構
編碼邏輯❌ 不共用需獨立實作驗證
解碼邏輯❌ 不共用需獨立實作驗證

5.2 GST.Protocols.SMB

GST.Protocols.SMB/
├── Constants/
│ ├── ControlCharacters.cs # STX, ETX, ACK, NACK
│ ├── DeviceAddresses.cs # 設備地址
│ ├── HanvonPumpCodes.cs # NP7000 PFC 碼
│ ├── HanvonDetectorCodes.cs # NU3000/UV1000D PFC 碼
│ ├── SksValveCodes.cs # S3612/S3203 協定常數
│ └── EppCodes.cs # EPP 協定常數
├── Enums/
│ ├── PumpRunState.cs
│ ├── ValvePosition.cs
│ └── ...
├── Specifications/
│ ├── NP7000Spec.cs # 流量/壓力規格
│ └── ...
└── Models/
├── PumpStatus.cs
├── DetectorStatus.cs
└── ...

6. UI Layer 詳解

位置D:\WorkSpace\GatherTech\Core\GST-develop\src\UI\

6.1 GST.UI.Abstractions

用途:UI 層的 Interface 定義,提供框架無關的 UI 抽象。

GST.UI.Abstractions/
├── Commands/
│ ├── IRelayCommand.cs # 命令介面
│ ├── AsyncRelayCommand.cs # 非同步命令
│ └── RelayCommand.cs # 同步命令
├── Services/
│ ├── IDialogService.cs # 對話框服務
│ ├── INavigationService.cs # 導航服務
│ └── IMessageBus.cs # 訊息匯流排
├── ViewModels/
│ ├── IViewModel.cs # ViewModel 介面
│ ├── ViewModelBase.cs # ViewModel 基類
│ └── IDialogViewModel.cs # 對話框 ViewModel
└── Views/
├── IView.cs # View 介面
└── IDialogView.cs # 對話框 View

6.2 GST.UI.Wpf

用途:WPF MVVM 支援,提供 WPF 專屬實作。

主要元件

元件用途
WpfViewModelBase支援 Dispatcher 的 ViewModel 基類
WpfDialogViewModelBase對話框 ViewModel 基類
WpfDialogServiceWPF 對話框服務實作
LocalizeExtensionXAML 本地化標記擴展

WpfViewModelBase 使用範例

public class MainViewModel : WpfViewModelBase
{
private string _statusMessage = string.Empty;

public string StatusMessage
{
get => _statusMessage;
set => SetProperty(ref _statusMessage, value);
}

public async Task LoadDataAsync()
{
IsBusy = true;
try
{
var data = await _dataService.GetDataAsync();

// 自動在 UI Thread 更新
StatusMessage = $"Loaded {data.Count} items";
}
finally
{
IsBusy = false;
}
}

// 需要明確在 UI Thread 執行時
protected void UpdateUI(Action action)
{
InvokeOnUIThread(action);
}
}

本地化擴展使用範例

<!-- XAML -->
<Button Content="{l:Localize Save}" />
<TextBlock Text="{l:Localize Errors.Required}" />

常用 Converter

Converter用途
BooleanToVisibilityConverterbool → Visibility
InverseBooleanConverterbool 反轉
NullToVisibilityConverternull → Collapsed

7. Application Layer 詳解

7.1 專案類型

類型命名格式範例
通用應用GST.App.{Name}GST.App.ProcessVision
喬璞專案Jope.{Name}Jope.SMB.Core, Jope.SMB.WPF
樂宇專案Leyu.{Name}Leyu.Equipment.Control

7.2 應用層結構範例

Jope.SMB.App/
├── src/
│ ├── Jope.SMB.Core/ # 業務邏輯
│ │ ├── Devices/ # 設備控制
│ │ ├── Control/ # 控制邏輯
│ │ └── Services/ # 服務
│ └── Jope.SMB.WPF/ # WPF UI
│ ├── ViewModels/
│ ├── Views/
│ └── Converters/
└── tests/
└── Jope.SMB.Core.Tests/

8. 開發流程與規範

8.1 必讀文件

文件位置
共用規範D:\WorkSpace\GatherTech\PM\docs\shared\agent-rules\COMMON-RULES.md
命名規範D:\WorkSpace\GatherTech\PM\docs\shared\GST-CSharp-Naming-Conventions.md

8.2 命名規範速查

類型格式範例
InterfaceI{Name}IUserService
Private Field_camelCase_userRepository
Async Method{Name}AsyncGetUserByIdAsync
Boolean PropertyIs/Has/Can/ShouldIsConnected

8.3 Git 分支策略

main ─────────────────────────────────────────────►

└── develop ───────────────────────────────►

├── feature/gst-xx-description ──►

└── feature/jop-xx-description ──►

8.4 Commit Message 格式

<type>(<scope>): <subject> (ref <issue-id>)

type: feat, fix, docs, style, refactor, perf, test, chore
scope: 模組名稱
subject: 簡短說明
issue-id: Linear Issue ID

範例:

feat(communication): add ICommunicationChannel interface (ref GST-72)
fix(pump): resolve timeout issue in SendCommandAsync (ref JOP-59)

9. 常見問題 FAQ

Q1: 新功能應該放在哪一層?

A: 依據功能性質:

  • 通用基礎功能 → Core Layer
  • 可插拔功能模組 → Plugin Layer
  • 設備協定常數 → Protocols Layer
  • 應用專屬功能 → Application Layer

Q2: 如何新增一個 Plugin?

A:

  1. src/Plugins/ 建立 GST.Plugin.{Name} 專案
  2. 實作 Interface(定義在 Abstractions)
  3. 提供 Add{Name} 擴充方法供 DI 註冊
  4. 撰寫單元測試

Q3: 編碼/解碼邏輯為什麼不放在 Protocols Layer?

A: 為了保持 Simulator 的交叉驗證價值。如果 App 和 Simulator 共用編碼/解碼邏輯,當邏輯有 bug 時兩邊都會有相同的錯誤,無法透過測試發現問題。

Q4: 如何處理 FDA Part 11 合規需求?

A: 使用標記為 FDA Part 11 的 Plugin:

  • GST.Plugin.UserManagement - 帳號管理
  • GST.Plugin.AuditTrail - 操作追蹤
  • GST.Plugin.ElectronicSignature - 電子簽章
  • GST.Plugin.FileStorage - Hash Chain 儲存

10. 相關資源

文件連結

文件位置
共用規範D:\WorkSpace\GatherTech\PM\docs\shared\agent-rules\COMMON-RULES.md
命名規範D:\WorkSpace\GatherTech\PM\docs\shared\GST-CSharp-Naming-Conventions.md
Multi-Agent 指南D:\WorkSpace\GatherTech\PM\docs\shared\GST-MULTI-AGENT-GUIDE.md

專案位置

專案位置
GST FrameworkD:\WorkSpace\GatherTech\Core\GST-develop\
Jope.SMB.AppD:\WorkSpace\GatherTech\喬璞科技\Jope.SMB.App\
GST.SimulatorD:\WorkSpace\GatherTech\Core\Simulator\GST.Simulator\

Linear 文件


下一步

  1. 深入了解特定模組:閱讀各 Plugin 的 README 或原始碼
  2. 實作練習:嘗試建立一個簡單的應用程式
  3. 參與開發:查看 Linear Issues,挑選適合的任務

版本歷史

版本日期變更
1.0.02026-01-18初版建立
1.1.02026-01-18GST-19 審查後補充:Core.Common、AuditTrail、UI.Wpf 詳細說明