引言
本文我将介绍在三层Web体系开发中的两种数据绑定模式然后在不超过你已经会用的控件知识的情况下来介绍能够极大减少这种数据绑定模式的替代品--XLib库文件具体的说本文开始我们介绍在三层体系结构里常规的数据绑定方法然后介绍XLib是如何提高这种绑定效率的
数据绑定流程
在三层Web体系结构里通常有四步来完成数据绑定任务
)从数据库里加载数据到业务逻辑对象
)在Web窗体上放置Web控件并使用业务逻辑对象进行填充数据
)将Web控件的值拷贝到业务逻辑对象的属性里
)保存业务逻辑对象的属性值到数据库
以具体的Customer为例在三层应用程序里最简单的数据绑定模式的步骤如下
)从数据库Customer表里加载合适的顾客记录
)将顾客记录绑定到Customer业务对象上
)将Customer业务对象绑定到Web控件上
)用户在窗体里输入数据并单击Submit进行提交数据
)将Web控件的更新事件绑定到Customer对象上
)把Customer上的信息保存到表里
)将表里的信息保存到Customer上
有多种方式执行这个流程我概括起来有三种
显示生成数据绑定方式--使用大家都熟悉的前台方式
Microsoft的方式--使用类型化的DataSet和FormView
XLib方式--使用反射技术和其他的NET特性来分析绑定--在运行时获取对象
代码--业务逻辑对象和Web 页面
为了具体说明这三种方式的使用方法我将使用Customer类和EditCustomer页面作为演示下面是一些代码它将说明具体在什么地方进行数据绑定
通常Customer类看起来类似如下
public class Customer
{
//list all properties
//CRUD methods
public void Load()
{
//Binding #
//Copy database record values into properties
}
public void Save()
{
//Binding #
//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 (!PageIsValid)
return;
SaveData();
//Go Back
}
private void LoadData()
{
Customer customer=new Customer();
customerID=_customerID;
customerLoad();
//Binding #
//Copy customer properties into control values
}
private void SaveData()
{
Customer customer=new Customer();
If (_isUpdateMode)
{
customerID=_customerID;
customerLoad();
}
//Binding #
//Copy control values into customer properties
customerSave();
}
}
三种数据绑定方式
方法显式声明数据绑定方式
编辑顾客信息的方法之一是显式的数据绑定方式这意味这对于每一个数据绑定都需要执行前面说的四个步骤例如对于Customer的Load方法可能的代码类似如下
public void Load()
{
…
//Load customer record using data reader
_firstName=(string)dataReader[FirstName];
_lastName=(string)dataReader[LastName];
…
}
在这种情况下当Customer对象有更多属性时您就需要编写更多的代码来完成数据绑定功能如果您想为Customer新增加一个属性你不得不在个地方进行更改
)数据库
)数据绑定--数据业务逻辑对象
)数据绑定--业务逻辑对象在绑定到Web控件上
)在Web窗体上添加新的控件
)数据绑定--Web控件绑定到业务逻辑上
)数据绑定--业务逻辑到数据库上
正如您所看到的上面方法的缺点--重复工作大且维护困难
使用微软的方式--类型化的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增加一个新的属性你就只需要更改三处就可以了
数据库
Web Form EditItemTemplate
Web Form InsertItemTemplate
XLib方式的绑定
XLib在同时能够提供前面介绍的两种绑定方式外还增加了数据维护方面的灵活性XLib使用反射技术来自动从业务逻辑对象到数据库到Web控件之间的映射
在执行数据库到业务逻辑对象方面它使用了XbusinessObjectBinder对象下面的代码片断样式了Customer对象的代码
public class Customer
{
…
public void Load()
{
dataReader=new XDataReader();
//Load data using autogenerated query into XDataReader
//XDataReader works just like data reader except it automatically
//converts Database values types into INulllable C# types
//Binding #
XBusinessObjectBinderFromDataReader(this dataReader);
}
public void Save()
{
XDataWriter dataWriter=new XDataWriter();
//XDataWriter automatically generates INSERT/UPDATE/DELETE sql s
//statements
//Binding #
XBusinessObjectBinderToDataWriter(this dataWriter)
dataWriterUpdate();
}
}
对于业务逻辑到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;
customerLoad();
//Binding #
XWebControlsBinderFromObject(this customer);
}
private void SaveData()
{
Customer customer=new Customer();
if (_isUpdateMode)
{
customerID=_customerID;
customerLoad();
}
//Binding #
//Copy control values into customer properties
XwebControlsBinderToObject(this customer);
customerSave();
}
}
正如您所看到的这种方法既去掉了第一种方法的缺点又具有第二中方法的有点