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

Asp.net多層架構中的變量引用與傳遞

2013-11-13 09:59:14  來源: .NET編程 

  的多層架構主要是為了解決數據層邏輯層表示層等之間的關系我的做法是這樣的首先建立一個DataCore的基類基類裡面封裝了一些低層的數據庫的基本操作比如說數據庫聯接調用存儲過程等等在這裡面有一個地方值得注意通過對一個函數的重載可以實現調用不同功能的存儲過程以下代碼示例

  

  

  protected int RunProcedure(string storedProcName IDataParameter[] parameters out int

  rowsAffected )
{

  int result;

  ConnectionOpen();

  SqlCommand command = BuildIntCommand( storedProcName parameters );

  rowsAffected = commandExecuteNonQuery();

  result = (int)commandParameters[ReturnValue]Value;

  ConnectionClose();

  return result;

  }

  protected SqlDataReader RunProcedure(string storedProcName IDataParameter[] parameters )

  {

  SqlDataReader returnReader;

  ConnectionOpen();

  SqlCommand command = BuildQueryCommand( storedProcName parameters );

  commandCommandType = CommandTypeStoredProcedure;

  returnReader = commandExecuteReader();

  //ConnectionClose();

  return returnReader;

  }

  protected DataSet RunProcedure(string storedProcName IDataParameter[] parameters

  string tableName )

  {

  DataSet dataSet = new DataSet();

  ConnectionOpen();

  SqlDataAdapter sqlDA = new SqlDataAdapter();

  sqlDASelectCommand = BuildQueryCommand( storedProcName parameters );

  sqlDAFill( dataSet tableName );

  ConnectionClose();

  return dataSet;

  }

  protected void RunProcedure(string storedProcName IDataParameter[] parameters

  DataSet dataSet string tableName )

  {

  ConnectionOpen();

  SqlDataAdapter sqlDA = new SqlDataAdapter();

  sqlDASelectCommand = BuildIntCommand( storedProcName parameters );

  sqlDAFill( dataSet tableName );

  ConnectionClose();

 

  道理很簡單一看就懂對於以後的操作有好處的

  其次是要建立邏輯層這個邏輯層基本上就是實例化數據層DataCore之後為表示層返回一些DataSetDataReader之類或是執行一些insertupdatedelete之類語句這個邏輯層也是為了區分整個Project下面不同功能模塊比如說用戶模塊起名叫做UserModelcs新聞模塊叫做NewsModelcs之類邏輯層的另一個好處就是可以為表示層建立可以多次實例化的同一個對象或是方法比如說User類通過ID或是Username 查詢並建立的對象可以被表示層多次調用

  最後是表示層表示層的功能就是完成頁面邏輯主要是接受客戶端數據然後經過簡單整合和判斷傳遞給邏輯層處理同樣接收邏輯層傳遞來的Dataset或DataReader表示在前台頁面

  數據在各個層次之間的關系相對獨立但是又相對連續

  獨立性

  對於表示層之外的幾個層都可以把單個的對象或是方法直接拿出來放到其他工程中因為每個曾都是為了實現模型中獨立的功能而完成的因為在類似工程中的應用基本上不用太大改動特別是一些相對更加原始的層在這個示例中的DataCore就是一個典型的例子

  連續性

  數據在傳遞過程中有較強的連續性舉一個例子在表示層中有這樣一個根據Session中Userid返回一個Dataset原本我是這樣寫的:

  表示層

  DataSet UserInforRow = ObjectUserGetUserInfor(IntParse(Session[UserId]ToString()));
邏輯層

  

  

  public DataSet GetUserInfor(int UserID)
{

  SqlParameter[] parameters ={new SqlParameter(@UserIDSqlDbTypeInt)};

  parameters[]Value = UserID;

  using(DataSet UserInfor = RunProcedure(GetUserInforparametersUserInfor))

  {

  return UserInfor;

  }

  這樣可以編譯通過但是在執行的時候提示錯誤類型不匹配語法上面沒有錯誤

  但是錯誤出在表示層傳進來的是一個Int在Sqlparameter中確是一個Int本來以為這樣的變量類型都是在每一個層次中相對獨立的但是當他們之間傳遞數據的時候出現了問題

  對於這個問題的解決方案有兩種無非是更改表示層還是更改邏輯層更改邏輯層就要改成

  SqlParameter[] parameters ={new SqlParameter(@UserIDSqlDbTypeInt)};

  更改表示層要改為

  DataSet UserInforRow = ObjectUserGetUserInfor(intParse(Session[UserId]ToString()));
兩個方案中顯然是更改表示層比較合理因為不能夠因為一個變量的傳遞更改變邏輯層中的可以被其他表示層頁面所調用的方法

  其他類似的變量傳遞和引用也遇到類似問題雖然幾個層次相對獨立但是在數據的傳遞上也相對連續


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