一. 引言
Visual Studio 2005提出了“用更少的代价实现更高的性能”的口号。Visual Studio 2005中提供了大量的向导—特别是在生成数据存取代码方面;这些向导大大减少了代码的编写量。请注意,自动添加到你的工程中的任何代码都遵循了某种严格的逻辑和良好的
设计模式。因此,全面理解Visual Studio 2005在这方面的工作原理有助于你以后进一步修改和扩展这些代码从而构建你自己的定制的数据存取层。本文将对表格适配器和绑定源组件相应的代码展开深入的分析。
自从微软发行.NET框架2.0、Visual Studio 2005和ASP.NET 2.0以来,其关键卖点之一在于,同样的工作如今你只需要编写更少的代码,并且常常不需要任何编码。
简言之,“no-code-at-all”的口号其实是大量存在的向导、插件与设计器—你可以通过鼠标拖动、复选框和按钮交互方式在其中进行编程。只要对你想实现的内容加以“声明”,那么微软的工具会针对你提出的要求生成相应的代码。你可能还记得那名老口号“所见即所得”—正是在这种口号倡导下产生了如Visual Basic这样的快速原型开发工具。我想,现在我们可以把这个口号再改一下,那就是“所得即工具所想”(what-you-get-is-what-the-tool-thinks-you-want)。
事实上,在Visual Studio 2005中,你会发现存在大量的Windows表单和ASP.NET数据控件用于连接到中间层对象以便迅速而高效地创建数据驱动的应用程序。
基于最新的Visual Studio 2005数据设计器,你可以通过用户驱动的向导来创建代码。然而,在你点击“Finish”按钮后得到的代码中往往包含了比以前版本的Visual Studio中更多的抽象。在此基础上,虽然你只需使用例如表格适配器和类型化的数据集等顶层对象,但是你最终得到的却是一个“瘦”的更好的中间层。而且,更重要的是,你可以选择把这个顶层API连接到你自己的数据存取层,从而完成一个正规化多层系统。
我的建议是:在任何情况下,你都应该避免把大量的ADO.NET相关的表单代码插入到ASP.NET页面和Windows表单事件的code-behind中。你应该总是坚持使用分层设计,并使用数据传输模式和有效的数据描述方式。但是,Visual Studio能够提供数据集并自动生成ADO.NET代码。另外,如今的Visual Studio 2005还能够为你提供数据集和定制对象并能自动生成一个能够进行大幅度定制的抽象层。
在本文中,我将从面向对象设计的角度来分析和讨论Visual Studio 2005数据设计器生成的代码。
二. 构建一个数据驱动的Windows表单 让我们一步步来创建一个数据驱动的Windows表单应用程序。我们的总体想法是构建一个基于表单的应用程序,它能够显示并编辑来自于Northwind数据库多个表格的数据。图1显示了最终的应用程序运行情况。
图1.本文示例程序的最终显示结果。 |
这个表单上有一些数据绑定控件,还有几个数据连接器控件。典型情况下,你首先要添加BindingNavigator控件以便让用户在一个绑定数据源记录中进行导航。这个BindingNavigator控件有一个类似于VCR的用户接口,它仅负责从数据源选择一个特定的记录并使之可应用于一个通用的编程接口。这个BindingNavigator控件提供的用户接口很容易使人联想到Microsoft Access中的工具栏。
在Windows Form 2.0中,大多数控件不直接绑定到一个集合对象,而是使用一个中间对象—绑定源—该绑定源被绑定到一个典型的可枚举的数据源对象上。注意,这个BindingNavigator控件不会抛出任何异常。
绑定源组件的设计目的主要是为了简化表单上的控件和绑定数据之间的绑定。另外,它还提供了许多其它类型的服务(如当前状态管理,改变通知,过滤等)。如前面所提及,一个绑定源组件其实是在用户接口元素和后端数据之间添加了一个间接层,如图2所示。
图2.绑定源组件介于用户接口和数据源之间。 |
你需要把该绑定源组件连接到一个物理数据源,然后把表单上的控件绑定到该绑定源。从现在开始,任何与数据源相关的数据交互都是通过这个绑定源实现的。典型的操作包括导航、检索、排序、过滤和更新。
其实,.NET框架2.0中的一个绑定源组件是一个派生自类BindingSource的类的实例。注意,尽管这个术语比较新一些并且特定于.NET框架2.0;但是,绑定源组件“背后”的核心概念对于一位.NET Windows开发老手来说应该不陌生。
是的,这种绑定源组件其实就是一个没有用户界面的组件,专门设计用于让开发者从Visual Studio 2005内部管理绑定对象,并且多数是以声明方式实现的。