Miklix

Dynamics AX 2012 SysOperation Framework 快速概览

已出版: 2025年2月15日 UTC 22:35:49

本文简要概述(或备忘单)了如何在 Dynamics AX 2012 和 Dynamics 365 for Operations 中的 SysOperation 框架中实现处理类和批处理作业。


为了使尽可能多的人能够访问本页面,本页面由英文机译而成。遗憾的是,机器翻译技术尚不完善,因此可能会出现错误。如果您愿意,可以在此处查看原始英文版本:

Dynamics AX 2012 SysOperation Framework Quick Overview

本文中的信息基于 Dynamics AX 2012 R3。它可能适用于其他版本,也可能不适用。(更新:我可以确认本文中的信息也适用于 Dynamics 365 for Operations)


这篇文章只是作为快速概述和备忘单。如果您是 SysOperation 框架的新手,我强烈建议您也阅读 Microsoft 的白皮书。如果您只是需要快速了解使用此框架开发操作所涉及的不同类,此处的信息可能会有用。

存在多种变化,但是当我使用框架时,我通常实现三个类:

  • 数据契约(应扩展 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 类的 main 方法就可以很简单了

public static void main(Args _args)
{
    ;

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

您基本上已经完成了。上面显然是一个非常简单的示例,该框架包含大量其他选项和可能性,但如果您在一段时间没有使用该框架时需要复习一下,这可以作为快速概述。

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

米克尔·邦·克里斯滕森

关于作者

米克尔·邦·克里斯滕森
迈克尔 是 miklix.com 的创建者和所有者。他拥有 20 多年的专业计算机程序员/软件开发人员经验,目前全职受雇于一家大型欧洲 IT 公司。不写博客时,他把业余时间花在各种兴趣、爱好和活动上,这在一定程度上反映在本网站涵盖的各种主题上。