Miklix

Dynamics AX 2012 SysOperation Framework 快速概覽

已發佈: 2025年2月15日 晚上10:35:51 [UTC]
最後更新: 2026年1月12日 上午8:39:15 [UTC]

本文提供了一個快速概述(或速查表),介紹如何在 Dynamics AX 2012 和 Dynamics 365 for Operations 的 SysOperation 框架中實作處理類別和批次作業。


該頁面是由英語機器翻譯而來的,以便盡可能多的人可以訪問。不幸的是,機器翻譯還不是一項完善的技術,因此可能會出現錯誤。如果您願意,可以在這裡查看原始英文版本:

Dynamics AX 2012 SysOperation Framework Quick Overview

本文資訊基於 Dynamics AX 2012 R3,可能不適用於其他版本。 (更新:我已確認本文資訊也適用於 Dynamics 365 for Operations。)


本文僅提供快速概述和速查表。如果您是 SysOperation 框架的新手,我強烈建議您同時閱讀微軟關於該主題的白皮書。如果您只是需要快速複習一下使用此框架開發操作時涉及的不同類,本文的資訊可能會有所幫助。

雖然有一些變體,但我在使用該框架時通常會實現三個類別:

  • 資料契約(應擴展 SysOperationDataContractBase)
  • 服務(應擴展 SysOperationServiceBase)
  • 控制器(必須繼承 SysOperationServiceController)

此外,我可能還會實作一個 UIBuilder 類別(必須繼承 SysOperationUIBuilder),但這只有在對話框由於某種原因需要比框架自動生成的對話框更高級時才有必要。


數據合約

資料契約包含操作所需的資料成員。它類似於 RunBase 框架中定義的典型 CurrentList 宏,但以類別的形式實作。資料契約應該繼承 SysOperationDataContractBase,但即使不繼承也能正常運作。繼承父類別的優點在於它提供了一些可能很有用的會話資訊。

[DataContractAttribute]
class MyDataContract extends SysOperationDataContractBase
{
    ItemId itemId;
}

在這個例子中,itemId 是一個資料成員。你需要為每個資料成員實作一個 parm 方法,並為其新增 DataMemberAttribute 屬性,以便框架能夠識別它。這樣,框架就可以自動為你建立對話框。

[DataMemberAttribute]
public ItemId parmItemId(ItemId _itemId = itemId)
{
    ;

    itemId = _itemId;
    return itemId;
}


服務

服務類別是包含實際業務邏輯的類別。它不負責顯示對話方塊、批次處理或任何類似的事情——這些是控制器類別的職責。透過分離這些功能,您更有可能設計出良好的程式碼並編寫出更可重複使用的程式碼。

與資料契約類類似,服務類別不需要繼承任何特定的類,但至少在預期服務將作為批次作業運行時,它應該繼承自 `SysOperationServiceBase` 類,因為該父類提供了一些關於批次上下文的資訊。啟動作業(即執行業務邏輯)的方法必須以資料契約類別的物件作為輸入,並且應該使用 `[SysEntryPointAttribute]` 進行修飾。例如:

class MyService extends SysOperationServiceBase
{
}

使用名為 run 的方法:

[SysEntryPointAttribute]
public void run(MyDataContract _dataContract)
{
    // run business logic here
}


控制器

控制器類別負責操作的執行和批次。它還能確保程式碼在 CIL 環境下執行,從而實現最佳效能。控制器類別通常繼承自 SysOperationServiceController 類,但也存在其他選擇。

class MyController extends SysOperationServiceController
{
}

超類別的建構子接受類別名稱、方法名稱和(可選的)執行模式作為參數。類別名稱和方法名稱應該是你的服務類別的名稱以及要在其上運行的方法的名稱。因此,你可以像這樣實作控制器的建構方法:

public static MyController construct()
{
    ;

    return new MyController(classStr(MyService),
    methodStr(MyService, run));
}

那麼 MyController 類別的主方法可以非常簡單,例如:

public static void main(Args _args)
{
    ;

    MyController::construct().startOperation();
}

基本上就完成了。以上顯然是一個非常簡單的範例,該框架還包含大量其他選項和可能性,但如果您有一段時間沒用該框架,則需要快速複習一下,這可以作為一個簡要概述。

進一步閱讀

如果您喜歡這篇文章,您可能也會喜歡這些建議:


分享至 Bluesky在 Facebook 分享在 LinkedIn 分享在 Tumblr 上分享分享至 X在 LinkedIn 分享固定在 Pinterest 上

Mikkel Christensen

關於作者

Mikkel Christensen
麥可 是 miklix.com 的創建者和所有者。他有超過 20 年的專業電腦程式設計師/軟體開發人員經驗,目前全職受僱於一家歐洲大型 IT 公司。不寫部落格時,他會將業餘時間花在各種各樣的興趣、愛好和活動上,這在一定程度上反映在本網站所涵蓋的主題的多樣性上。