我自己的一生

是你的,是我的,到底是谁的?

导航

 

分隔用户交互的功能到用户界面和用户处理组件,可以提供以下优势:

长期运行的用户交互状态更容易持久,允许一个用户交互被抛弃和重新执行,甚至可以使用不同的用户界面。例如,一个客户增加一些项到一个购物篮中,他使用的是WEB用户界面,然后让一个销售代表稍后技术订单。

相同的用户处理可以被多个用户界面重用。例如,在零售应用程序中,同一个用户处理被用于增加产品到一个购物篮,这个处理可以使用WEB界面,或者Window Form应用程序。

 

一个无组织结构的方法设计用户界面逻辑会导致令人不快的情景,如,应用程序的规模不断增长,或者新的需求被导入。如果你需要为给定设备增加特定的用户界面,也可以需要重新设计数据流和控制逻辑。

 

从用户那里分隔用户交互流为展现数据活动和采集数据活动,这样容易增加你应用程序的可维护性和提高清晰的设计,你可以在里面容易增加已知事实的复杂特征,诸如,支持脱机工作。图2.4显示了用户界面和用户处理彼此是如何被提取的。

 

 

2.4 用户界面和用户处理组件

 

用户处理组件帮助你解决以下用户界面设计问题:

处理并发的用户活动。有些应用程序允许用户在同一时间执行多个任务,这时会激活多个用户元素。例如,一个基于Window的应用程序可以显示多个窗体,或者一个WEB应用程序可能打开第二个浏览器窗体。

 

用户处理组件在单个组件中,通过封装所有过程需要的状态,简单地管理多个进行中的过程。通过合并一个自定义处理识别符到你的设计中,你可以映射每个用户界面元素到特定的用户处理实例中。

 

为一个活动使用多个面板。如果多个窗体或面板被用在一个指定的用户活动中,保持它们的同步就显得很重要。在一个WEB应用程序中,为一个活动,一个用户界面通常在一个页面中显示一批元素(可能包括帧)。然而,在富客户端应用程序中,你实际上有多个非模式窗体影响一个指定的处理。例如,在你的应用程序中,你可能有一个产品种类选择浮动窗体,让你指定一个特定的种类,在这里产品将会在另一个窗体中显示。

 

通过对所有的窗体集中它们的状态在一个单一的地方,用户处理组件帮助你实现这样类型的用户界面。更进一步,通过为状态数据使用绑定格式,你可以使跨多个用户界面元素之间简单地实现同步。

 

隔离来源于业务相关状态的长期运行的用户活动。有些用户处理可能被暂停,稍后再重新开始。用户处理的中间状态一般情况下与应用程序的业务数据相隔离存储,例如,一个用户指定一些需要的信息放置到一个订单里,然后,在稍后的时间里重新校验处理。未定的订单数据要和完整订单相关数据隔离开来进行持久化,你已完成的订单数据是不完整的,允许你在这个订单数据上执行业务操作(例如,计算当前月已完成的订单编号),而没有必要实现复杂过滤规则来避免操作不完整订单。

 

用户活动就像业务过程,可以有一个指定的“超时”,当活动必须有被取消和合适的补偿活动时,要交给业务过程。

 

也可以设计你的业务处理组件被序列化,或者和应用程序业务数据分隔开存储在它们的状态。

 

从用户界面隔离用户处理

从用户界面隔离出用户处理,需要:

1、 分辨出业务过程,或者会帮助你完成用户界面处理的过程。分辨用户如何看待这个任务(你通常会通过参考序列图来完成这个事情,这个序列图作为需求分析的一部分而创建)。

2、 识别业务过程需要的数据。必要时,用户处理能够提交这个数据。

3、 在用户活动的过程中,识别出你需要维护的附加状态,帮助展现塑胶和在用户界面里进行数据捕获。

4、 设计用户处理的可视化流,每个用户界面元素接受或者给出的控制流。

 

你也需要用代码实现,映射和用户处理相关的特定的用户界面:

ASP.NET页面必须获取当前用户处理,这个获取方法有:从Session对象中获取引用,或者从另外存储媒介中获取的合成的处理,比如,数据库。你需要这个参与Web页面中事件处理的控制。

窗体或控件需要保持一个对当前用户处理组件的引用。可以保持这个引用在一个成员变量里。不需要保持它在全局变量中,如果这样做了,无论什么原因,当应用程序用户界面逐渐增加时,组合用户界面将会变得非常复杂。

 

用户处理组件的功能性

用户处理组件:

提供一个简单方法融合用户界面元素到用户交互流中,而不需要重新开发数据流和控制流。

从实现中或者发生的设备处,从概念上隔离了用户交互流。

封装了可以影响用户处理流的异常。

保持用户交互当前状态的轨迹。

不要启动或指定事务。它们保持和应用程序业务逻辑相关的内部数据和它们的内部状态,需要时,可以持久化这些数据。

维护内部业务相关的状态,通常保持一个或多个业务实体,这些业务实体都被用户交互影响过的。可以把多个实体保存在私有变量中,或者一个内部数组中,或者合适的容器类型中。在ASP.NET应用程序的情况下,也可以选择保存对这些数据的引用到Session对象中,但是,这样做,会限制用户处理的生命周期的使用。

通过提供的一个“保存且稍后继续”特征,在另一个会话里重新开始一个用户交互。要实现这个功能,可以通过保存用户处理组件的内部状态在一些持久化形态中,或者稍后通过提供给用户一个可以继续特定活动的方法。可以创建一个自定义的任务管理的有用的组件,控制当前处理的激活状态。用户处理状态可以被存储在其中一个地方:

 

Ø 如果用户处理可以从其它设备或者计算机上继续,需要存储它在本地的中心处,如数据库。

Ø 如果正运行在非连接环境中,用户处理状态将需要存储在用户设备的本地。

Ø 如果用户界面运行在一个WEB场地,需要存储所有请求的状态在中心服务的地方,以便可以从任何服务的场地被继续。

 

可以通过调用业务处理组件或者数据访问逻辑组件初始化内部状态。

典型地,不要作为Enterprise Services组件实现。唯一的原因是:这样做,必须使用Enterprise Services基于角色的授权能力。

在应用程序中,可以开始于管理菜单的有用的自定义组件。