熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

三層Web體系結構裡的兩種數據綁定模式

2013-11-13 10:02:34  來源: .NET編程 

  引言

  本文我將介紹在三層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();
 }

  正如您所看到的這種方法既去掉了第一種方法的缺點又具有第二中方法的有點


From:http://tw.wingwit.com/Article/program/net/201311/12360.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.