我自己的一生

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

导航

 

从用户界面访问数据访问逻辑组件

数据访问逻辑组件暴露一些查询逻辑,有些应用程序的用户界面使用这些查询更容易展现数据。无论你的用户界面组件是否直接调用数据访问接口,你都不能用业务处理组件混合数据访问逻辑。

 

从你的用户界面直接访问访问数据访问逻辑组件,似乎同分层概念是矛盾的。然而,从你的应用程序的角度看,作为一个同系统的服务,这样的情况是有益的。你调用它,由它做主决定匹配内部组件请求的最合适响应。

 

在以下情况,你应该允许数据访问逻辑组件直接访问用户界面组件:

你希望和用户界面语义紧耦合数据访问方法和数据架构。这个耦合需要用户界面和数据架构维护共同的变化。

你的物理部署把数据访问逻辑组件和用户界面组件放置在一起,这样情况下,你可以从数据访问逻辑组件获取流方式的格式化数据(如,DataReader),这种方式可以直接跳跃到ASP.NET用户界面的输出,目的为了提高性能。如果你把数据访问和业务处理组件部署在不同的服务器上,你不能使用这样的优势。从运行的角度看,允许直接访问数据访问逻辑组件来获取流方式的优势,这意味着,在部署数据访问逻辑组件的地方可以访问数据库---或可能包括穿透防火墙端口的访问能力。更多这方面的信息,见第四章,“物理部署和运行需求。”

 

设计用户处理组件

同你的应用程序进行的用户交互可能遵循一个可预知的处理;例如,零售应用程序需要用户输入产品明细,查看全部价格,输入支付明细,最后,输入交货地址信息。这个过程包含显示、从大量用户界面元素接受输入、在处理过程中一个步骤到另一个步骤的每次转换之间的状态维护(产品已经被订购,信用卡明细等等)。当显示多个用户界面页面或者窗体时,帮助用户加工和处理状态管理需要你创建用户处理组件。

 

注意:用用户处理组件实现一个用户交互不是一个价值不高的任务。交付这个方法之前,你要小心评估你的应用程序是否需要用户处理组件提供编排和抽象的层次。

 

用户处理组件作为典型的DotNET类来实现,暴露可能被用户界面调用的方法。每个方法封装用户处理必须执行的一个指定行为。用户界面创建用户处理组件的一个实例,通过处理步骤使用它进行处理转换。在处理过程中,每个步骤会显示特定的窗体名字或者ASP.NET页面名字,这些名字会被硬编码在用户处理组件(因而紧紧地绑定它到特定的用户界面实现),或者从元数据存储中获取,比如配置文件(这样,在多个用户界面实现中容易重用用户处理组件)。为了隔离特定设备问题,设计被多个用户界面使用的用户处理组件会导致复杂的实现,但可以帮助你在多个团队之间分发用户界面的开发,各自使用相同的用户处理组件。

 

用户处理组件调整用户界面元素的显示。它们是从数据展现和被用户界面组件提供的获取功能中抽象出来的。你应该有意识的用全球化设计它们,允许在用户界面中被本地化。例如,你应该努力使用中立的文化数据格式化,在内部,使用Unicode字符格式化,容易吸收来自本地化用户界面的用户处理组件。

 

下面的代码显示了一个用户处理组件(校验过程)如何处理外观。

 

public class PurchaseUserProcess

{

public PurchaseUserProcess()

{

// 创建一个GUID来跟踪这个活动。

userActivityID = System.Guid.NewGuid();

}

private int customerID;

private DataSet orderData;

private DataSet paymentData;

private Guid userActivityID;

public bool webUI; //这个标志指出客户UI是一个WEB(或者不是)

public void ShowOrder()

{

if(webUI)

{

//这个代码用来显示一个订单明细页面

System.Web.HttpContext.Current.Response.Redirect

("http://www.myserver.com/OrderDetails.aspx");

}

else // 一定是WindowsUI

{

//这个代码显示一个订单明细窗体

OrderDetails = new OrderDetailsForm();

OrderDetails.Show();

}

}

public void EnterPaymentDetails()

{

//这个代码实现一个支付明细的页面或者窗体。

}

public void PlaceOrder()

{

//这个代码放置一个订单到这里

ShowConfirmation();

}

public void ShowConfirmation()

{

//这里的代码显示到这里的批准页面或者窗体

}

public void Finish()

{

//这里的代码返回主页面或者窗体。

}

public void SaveToDataBase()

{

//这里的代码保存你的订单和支付信息在私有变量中。

//这里放到数据库

}

public void ResumeCheckout(System.Guid ProcessID)

{

//这里代码重新从数据库加载处理状态。

}

public void Validate()

{

//这里放置的代码保证处理实例变量是当前步骤正确的信息。}

}