Miklix

Dynamics AX 2012 SysOperation Framework 快速概览

已出版: 2025年2月15日 UTC 22:35:49
最后更新 2026年1月12日 UTC 08:39:14

本文提供了一个快速概述(或速查表),介绍如何在 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 公司。不写博客时,他把业余时间花在各种兴趣、爱好和活动上,这在一定程度上反映在本网站涵盖的各种主题上。