首页 > 代码库 > 4.2 框架特性

4.2 框架特性

1.目标

  • 描述事件的概念,并介绍怎样在AX中使用它。
  • 描述与AX结合的多种方法。
  • 描述AX中可用的多用服务类型。
  • 为.NET操作X++使用一个代理类
  • 从X++访问托管的程序集。
  • 解释如何部署.NET Framework程序集。

2.介绍

在AX2012中,有许多框架可用。本章提供对AX2012中一些框架、子系统和特性的描述。框架是设计模式、接口和代码的容器,为开发者提供支持。

2.1事件

事件是客制化的设计模式,用来设计启用无干扰、可维持的客制化。该技术允许你客制化系统,而不用广泛地改变基本应用的源代码。

事件允许客制化事件处理器中实现的行为。时间处理器代码在响应中被调用,用来相应一个事件。

要了解事件的更多信息,看本章的“Event Handlers for Customization”。

2.2地址系统

地址由地址子系统处理。全局地址簿,或地址子系统,能帮助你理解大量人和组织渐渐的关系。例如,一个客户也可以是市场竞争中的一个供应商,在组织中的工人,也能成为供应商。

注意:要了解更多地址系统,参考Application Foundation Features章节的“Global Address Book”。

2.3批处理日记框架

批处理日记框架,能用于运行一组被RunBase框架创建的任务。

提示:每个任务都有单独的tts 事务控制。

RunBase框架提供一个标准的途径,在AX中创建进程和批处理任务。框架必须被应用中每个工作类型的功能所使用。

该框架被RunBase application类实现,提供了许多特性:

  • Query
  • Dialog,展示用户最后输入的值
  • Validate
  • 为用户执行批处理,来计划工作。该功能使用RunBaseBatch类,和pack(),unpack()方法,使用版本控制。
  • 进度条
  • Run
  • 优化过的客户端/服务端

注意:要了解更多RunBaseframwork,参考http://go.microsoft.com/fwlink/?LinkId=238164。

2.4业务操作框架

业务操作框架(BOF),遵守WCF的协议和标准。使用BOF,你可以做:

启用菜单驱动的执行,或服务的批处理执行。

以同步或异步的模式调用服务

基于数据契约自动创建一个客制化的用户界面

囊括代码,在适当的层上操作。在客户端层输入,业务逻辑在服务端层。

要了解更多关于BOF的信息,参考本章的"Business Operation Framework"

2.5前后一致检查框架

前后一致检查框架,用于验证数据在生产数据库中的前后一致,帮助修复它找到的不一致。

前后一致框架的类,以ConsistencyCheck结尾,例如InventConsistencyCheck。每个框架类都扩展自SysConsistencyCheck类。

2.7维度

你可以使用Dimension子系统,为财务维度工作。使用InventDim子系统,为库存维度工作。

要了解更多关于财务维度子系统,参照Application Foundation Features章节的Dimensions。

2.8文档管理系统

在AX中,文档管理系统自动随处可用。文本笔记,任何类型、格式的文档,能被附加到AX中的任何记录上。

笔记字段应该不能放在你自己的表上,而是使用文档管理系统的文本笔记。

注意:如果文档附加到一个记录上,存储在一个共享文件,而不是AX数据库中,你必须确保设置了合适的访问等级。

2.9Infolog

给用户的信息和消息,在Infolog中。它也包含上下文信息,提供Help和action。要了解更多,查看

 http://go.microsoft.com/fwlink/?LinkId=238165。

2.10数字序列

AX有一个数字序列框架来生成字母数字的数字序列,用于标识销售订单这样的交易文档。

2.11操作进度

使用Operation Progress framework,来显示该进程要花费多少时间。

基本实践:使用一个进度显示器,为花费超过两分钟的操作提供标识。

使用沙漏鼠标指针,如果进程要花费2到7分钟。

使用进度条,如果进程花费8分钟或更多。

注意:要了解更多信息,How to: Create Progress Indicators (http://go.microsoft.com/fwlink/?LinkId=238166。

2.12报表

SSRS是AX主要的报表平台。默认地,AX提供开箱即用的报表,运行在报表服务平台。新报表开发环境,又花了扩展自SQL Server tools和组件。报表开发环境完全集成进了VS。

2.13应用集成

AX与与其他企业内部和外部系统集成的能力,是一个公共的需求。应用集成框架AIF,提供通过XML格式交换数据的能力。格式化的XML,作为文档的引用,并且每个文档包含数据和业务逻辑。文档给予一个文档类,使用AX定义。

AX提供许多标准的文档服务,支持公共的业务草错。通过使用AIF提供的能力,你也能客制化现有文档服务,或穿件自己的文档服务。

注意:要了解更多AIF,BOF,查看Application Integration Framework and Services课程。

3.时间处理器的客制化

该主题描述事件的概念,并介绍在AX中如何使用它们。

AX很少不用修改地使用,因为客户有他们自己的一套需求,来实现产品。正因为这样,伙伴要客制化产品。伙伴也投资重要的时间,来浏览并理解微软提供的源代码。当需要客制化时,伙伴修改客户层的代码,运行时引擎担保客制化发生。然而,存在一个问题是,当新版本发布,或微软底层代码改变,客制化会被破坏,对伙伴来说,为下个版本升级客制化代码,会很昂贵。附加地,当一个客户使用多个独立软件供应商ISV或伙伴,他们可能会修改同一个对象。当覆盖对象时,会导致相同的问题。

通过使用事件,可以减少创建和升级客制化的花费。开发者创建客制化代码,其他用户在该处创建事件。然后,这些开发者在其他可以被事件订阅的层,客制化原始功能。当客制化功能紧密地与事件结合,底层应用代码能为溶血,并且他会在客制化上产生一些效果,因为相同的事件在不同的版本中,以相同的顺序调用。

3.1天然的事件

例如,类代表了现实生活中的一些事情,它的名字是会计,人,客户。方法用于改变对象,它的名字指什么操作在对象上执行,如deposit,hire,invoice.

一个事件,代表了对象里要发生的事情。事件的名字典型是过去式,如deposited,hired,invoiced。事件会总是发生。

你可以使用时间,来为下面的编程范式提供支持:

Observation:观察者模式,事件可以用于查看预期的行为,当行为发生时,生成警报。该事件类型的例子是,regulation compliance systems.例如,如果多个指定金额的货币从一个账户传输到另一个账户,系统出发一个工作流,来询问是否接受介意。

Information dissemination:信息传播,事件分发相应的信息给合适的调用者,在大多数情况下。信息传播通过发布一个事件给任何想要对此作出反应的人。

Decoupling:解耦,事件可以被一个应用的完整的不同部分。他不需要为生产者知道消费,也不需要消费者知道生产者的细节。以恶生产者的时间,可以被多个消费者扮演,另外,消费者可以扮演多个生产者的事件。

提示:X++和C#的时间设计模式的实现不同。要了解更多信息,"X++ and C# Comparison: Event
(http://go.microsoft.com/fwlink/?LinkId=238167)"。

3.2术语

AX2012中的X++事件,是仿照.NET事件概念。下表列出了AX2012相关的事件术语:

术语Term 定义Definition
Producer 生产者,是包含导致一个变化的代码的逻辑。他是发出事件的一个实体。
Consumer 消费者,是当一个特定事件发生时,代表提醒的应用代码。他是接收事件的一个实体。
Event 事件,代表了在生产者发生的变化。
Event payload 事件装载货物,是事件里携带的信息。例如,当一个人被解雇了,装载货物可能包含雇员的名字和生日。
Delegate 一个代理,是,当事件发生时,信息从生产者传递到消费者的一个定义。

3.3代码事件

在X++,你能添加代理作为一个类的成员。定义代理的语法,与定义一个方法的语法相同,除了下面的:

  • 要使用delegate关键字
  • 没有public或任何其他
  • 返回类型必须是void
  • body必须是空的,意味着,它不能包含declarations or satements。

例如,一个人被解雇时的事件代理,可以被表达成如下:

delegate void hired(str name, UtcDateTime startingDate) 
{ 
}

提示:你可以在class上右键,选择New>Delegate,来创建一个新代理,或你可以从代码编辑器上选择New,并填入代码。

下面显示了一个类,叫做HireWorkerEventSample,他包含了一个代理,叫做hired,它接受一个string和一个date。

提示,闪电图标表明了他是一个代理,不是一个X++方法。

当应用代码不得不发信号,一个新人杯解雇,他用代理作为一个方法调用,提供事件装在负荷作为参数,如下面例子显示:

{ 
while select * from Employees where 
Employees.hiredDate == today 
{ 
this.hired(employees.Name, 
employees.FirstWorkingDay); 
} 
}

注意:代码示例,只是一个例子。代码在AX中不能编译,因为没有Employee表。

参数,可以是任何X++接受的类型。它用于传递一个对象的实例,能让处理者修改该对象的状态,所以发布者能从订阅者请求值。事件处理者在调用者事务上下文里运行。订阅者可以被添加给事件,以两种方法中的一种——通过AOT或X++代码。

3.4自动事件

自动事件被环境触发,作为什么事情的执行结果。现在,开发者可以在方法被调用时,指示一个一个事件被触发。描述见下面。

Pre和Postsh是方法被调用时的预定义事件。pre-event处理器在方法执行前调用,post-evet hndlers在方法结束后被调用。