首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF4.0 實戰(二十二):真實場景狀態機範例——門禁控制系統

     編輯:關於.NET

本文翻譯自 Mebyon Kernow 的 "A practical State Machine example",以建築物門禁控制為例,展示 WF4 狀態機核心功能。狀態機套件發布於 Codeplex。

狀態機模型

初始狀態:所有門關閉並鎖定 (ClosedLocked)。使用者提供憑證觸發 Unlocked 轉換,驗證通過進入 ClosedUnlocked。其後三種可能:開門、再次鎖定、超時自動鎖定 (5 秒)。

門禁狀態機狀態轉換圖

State 與 Transition 核心概念

  • State:可定義 Entry/Exit 活動,雙擊 State 於設計器設定。
  • Transition:類似 Pick 活動,多個分支並行等待,最先完成者觸發轉換。可設定 Condition 與 Action。
State Entry/Exit 活動編輯介面 Transition 執行邏輯示意 ClosedLocked 狀態的 Transition 結構

自訂書簽活動 DoorEvent

等待外部觸發 (WPF UI 按鈕) 恢復書簽:

public class DoorEvent : NativeActivity
{
    protected override bool CanInduceIdle => true;

    [RequiredArgument]
    public InArgument<string> BookmarkName { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        context.CreateBookmark(BookmarkName.Get(context), OnBookmarkResumed);
    }

    private void OnBookmarkResumed(NativeActivityContext context, Bookmark bookmark, object state) { }
}

WPF MVVM 宿主整合

  • MainViewModel 管理多個 DoorModel (每道門一個)
  • DoorModel 建立 WorkflowApplication,註冊 IDoor 擴充
  • State Entry 執行 SetDoorState 更新 ViewModel 狀態
  • UI 按鈕命令呼叫 _stateMachine.ResumeBookmark("Unlocked", null)
_unlockCommand = new DelegateCommand(
    unused => _stateMachine.ResumeBookmark("Unlocked", null),
    unused => this.DoorState == DoorState.ClosedLocked);

Transition 中播放音效

使用自訂 PlaySound 活動於 Transition Action 中播放,區分不同轉換觸發的聲音 (鎖定、解鎖、超時),避免放在 State Entry 無法知曉來源轉換。

WPF 門禁控制 UI 介面

執行應用程式可見狀態即時更新、按鈕啟用/停用同步、轉換聲音回饋,完整展示狀態機與 UI 雙向綁定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved