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,但即使不扩展,它也可以工作。扩展超类的优点是它提供了一些可能有用的会话信息。
class MyDataContract extends SysOperationDataContractBase
{
ItemId itemId;
}
在此示例中,itemId 是数据成员。您需要为每个数据成员实现一个 parm 方法,并使用 DataMemberAttribute 对其进行标记,以便框架知道它是什么。这使框架能够自动为您构建对话框。
public ItemId parmItemId(ItemId _itemId = itemId)
{
;
itemId = _itemId;
return itemId;
}
服务
服务类是包含实际业务逻辑的类。它不关心显示对话框、批处理或任何此类内容 - 这是控制器类的职责。通过分离它们,您更有可能设计出更好的代码并创建更可重用的代码。
与数据契约类一样,服务类不需要从任何特定类继承,但它应该从 SysOperationServiceBase 类继承,至少如果您希望服务将作为批处理作业运行,因为超类提供了一些有关批处理上下文的信息。启动操作(即运行业务逻辑)的方法必须将数据契约类的对象作为输入,并应使用 [SysEntryPointAttribute] 进行修饰。例如:
{
}
使用名为 run 的方法:
public void run(MyDataContract _dataContract)
{
// run business logic here
}
控制器
控制器类负责处理操作的执行和批处理。它还确保代码在 CIL 中执行,以实现最佳性能。控制器类通常继承自 SysOperationServiceController 类,但也有其他选项。
{
}
超类的构造函数以类名、方法名和(可选)执行模式作为参数。类名和方法名应该是服务类的名称以及应在其上运行的方法。因此,您可以像这样实现控制器的构造方法:
{
;
return new MyController(classStr(MyService),
methodStr(MyService, run));
}
然后 MyController 类的 main 方法就可以很简单了
{
;
MyController::construct().startOperation();
}
您基本上已经完成了。上面显然是一个非常简单的示例,该框架包含大量其他选项和可能性,但如果您在一段时间没有使用该框架时需要复习一下,这可以作为快速概述。