引言
本文我将介绍在三层Web体系开发中的两种数据绑定模式,然后在不超过你已经会用的控件知识的情况下,来介绍能够极大减少这种数据绑定模式的替代品--XLib库文件。具体的说,本文开始我们介绍在三层体系结构里常规的数据绑定方法,然后介绍XLib是如何提高这种绑定效率的。
1、 数据绑定流程
在三层Web体系结构里,通常有四步来完成数据绑定任务:
1)从数据库里加载数据到业务逻辑对象
2)在Web窗体上放置Web控件并使用业务逻辑对象进行填充数据。
3)将Web控件的值拷贝到业务逻辑对象的属性里
4)保存业务逻辑对象的属性值到数据库。
以具体的Customer为例,在三层应用程序里最简单的数据绑定模式的步骤如下:
1)从数据库Customer表里加载合适的顾客记录
2)将顾客记录绑定到Customer业务对象上
3)将Customer业务对象绑定到Web控件上
4)用户在窗体里输入数据并单击Submit进行提交数据
5)将Web控件的更新事件绑定到Customer对象上
6)把Customer上的信息保存到表里
7)将表里的信息保存到Customer上
有多种方式执行这个流程,我概括起来有三种:
1、显示生成数据绑定方式--使用大家都熟悉的前台方式
2、Microsoft的方式--使用类型化的DataSet和FormView
3、XLib方式--使用反射技术和其他的.NET特性来分析绑定--在运行时获取对象
1.2 代码--业务逻辑对象和Web 页面
为了具体说明这三种方式的使用方法,我将使用Customer类和EditCustomer页面作为演示。下面是一些代码,它将说明具体在什么地方进行数据绑定。
通常,Customer类看起来类似如下:
public class Customer
{
//list all properties
//CRUD methods
public void Load()
{
//Binding #1
//Copy database record values into properties
}
public void Save()
{
//Binding #4
//Copy properties values into database record
}
public void Delete() ;
//Other methods specific to customer
public string GetCustomerFullName()..
}
编辑顾客页面的代码类似如下:
//页面的一些指令
//与Form窗体有关的一些顾客属性
//提交和取消按钮
编辑用户信息的后台代码类似如下:
public partial class EditCustomer
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack){
//Check if adding new customer or updating
if (_isUpdateMode)
LoadData();
}
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
if (!Page.IsValid)
return;
SaveData();
//Go Back
}
private void LoadData()
{
Customer customer=new Customer();
customerID=_customerID;
customer.Load();
//Binding #2
//Copy customer properties into control values
}
private void SaveData()
{
Customer customer=new Customer();
If (_isUpdateMode)
{
customer.ID=_customerID;
customer.Load();
}
//Binding #3
//Copy control values into customer properties
customer.Save();
}
}
2 三种数据绑定方式
2.1 方法1:显式声明数据绑定方式
编辑顾客信息的方法之一是显式的数据绑定方式,这意味这对于每一个数据绑定都需要执行前面说的四个步骤,例如对于Customer的Load方法,可能的代码类似如下:
public void Load()
{
…
//Load customer record using data reader
_firstName=(string)dataReader["FirstName"];
_lastName=(string)dataReader["LastName"];
…
}
在这种情况下,当Customer对象有更多属性时,您就需要编写更多的代码来完成数据绑定功能。如果您想为Customer新增加一个属性,你不得不在6个地方进行更改:
1)数据库
2)数据绑定1--数据业务逻辑对象
3)数据绑定2--业务逻辑对象在绑定到Web控件上
4)在Web窗体上添加新的控件
5)数据绑定3--Web控件绑定到业务逻辑上
6)数据绑定4--业务逻辑到数据库上
正如您所看到的上面方法的缺点--重复工作大且维护困难
2.2 使用微软的方式--类型化的DataSet和FormView
对于这个方法,微软已经为我们提供了很多例子了,,如果您的程序足够简单,那么您就可以从Customer表里生成一个类型化的DataSet,并将其绑定到FormView上,由FormView来执行添加和编辑Customer对象的功能,您可以在下面两个地方发现如何使用他们:
Creating DAL using typed DataSets
Modifying Data using FormView web control
对于 Database和Business对象之间的绑定,您可以使用类型化的DataSet向导完成,对于Busiess和Web控件之间的绑定您可以使用FormView控件的InserItemTemplate和EditItemTemplate 模板完成,并制定绑定规则,类似代码如下:
<asp:TextBox ID="txtLastName" Text='' RunAt="Server" />
您可能已经注意到了在微软提供的例子里使用这种方式对简单应用程序来说,工作的确实相当的好,但是对于稍微复杂的应用程序来说,您就需要不断扩展自己的代码。
这种方式可以简单数据的维护,例如你需要为Customer增加一个新的属性,你就只需要更改三处就可以了:
1、数据库
2、Web Form - EditItemTemplate
3、Web Form - InsertItemTemplate
2.3 XLib方式的绑定
XLib在同时能够提供前面介绍的两种绑定方式外,还增加了数据维护方面的灵活性。XLib使用反射技术来自动从业务逻辑对象到数据库,到Web控件之间的映射。
在执行数据库到业务逻辑对象方面,它使用了XbusinessObjectBinder对象,下面的代码片断样式了Customer对象的代码:
public class Customer
{
…
public void Load()
{
dataReader=new XDataReader();
//Load data using auto-generated query into XDataReader
//XDataReader works just like data reader - except it automatically
//converts Database values types into INulllable C# types
//Binding #1
XBusinessObjectBinder.FromDataReader(this, dataReader);
}
public void Save()
{
XDataWriter dataWriter=new XDataWriter();
//XDataWriter automatically generates INSERT/UPDATE/DELETE sql s
//statements
//Binding #4
XBusinessObjectBinder.ToDataWriter(this, dataWriter)
dataWriter.Update();
}
}
对于业务逻辑到Web控件的绑定,它提供了XWebControlsBinder 控件,下面代码片断显示了顾客编辑页面的代码:
public partial class EditCustomer
{
protected void Page_Load(object sender, EventArgs e)
{…}
protected void btnSubmit_Click(object sender, EventArgs e)
{…}
private void LoadData()
{
Customer customer=new Customer();
customerID=_customerID;
customer.Load();
//Binding #2
XWebControlsBinder.FromObject(this, customer);
}
private void SaveData()
{
Customer customer=new Customer();
if (_isUpdateMode)
{
customer.ID=_customerID;
customer.Load();
}
//Binding #3
//Copy control values into customer properties
XwebControlsBinder.ToObject(this, customer);
customer.Save();
}
}
正如您所看到的,这种方法既去掉了第一种方法的缺点,又具有第二中方法的有点。