談Asp.net多層架構(gòu)中的變量引用與傳遞_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:基于.NET Framework 微軟Silverlight下載
      Silverlight是一個(gè)跨瀏覽器的、跨平臺(tái)的插件,為Web帶來下一代媒體體驗(yàn)和豐富的交互式應(yīng)用程序體驗(yàn)。 做為微軟出品的一個(gè)瀏覽器增強(qiáng)模塊,它使得瀏覽器可以在HTML中渲染豐富的內(nèi)容。它

      Asp.net的多層架構(gòu)主要是為了解決數(shù)據(jù)層,邏輯層,表示層等之間的關(guān)系。我的做法是這樣的:首先建立一個(gè)DataCore的基類。基類里面封裝了一些低層的數(shù)據(jù)庫(kù)的基本操作,比如說數(shù)據(jù)庫(kù)聯(lián)接,調(diào)用存儲(chǔ)過程等等。在這里面有一個(gè)地方值得注意,通過對(duì)一個(gè)函數(shù)的重載可以實(shí)現(xiàn)調(diào)用不同功能的存儲(chǔ)過程。以下代碼示例:

      以下為引用的內(nèi)容:

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

      rowsAffected )
      {

      int result;

      Connection.Open();

      SqlCommand command = BuildIntCommand( storedProcName, parameters );

      rowsAffected = command.ExecuteNonQuery();

      result = (int)command.Parameters["ReturnValue"].Value;

      Connection.Close();

      return result;

      }

      protected SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters )

      {

      SqlDataReader returnReader;

      Connection.Open();

      SqlCommand command = BuildQueryCommand( storedProcName, parameters );

      command.CommandType = CommandType.StoredProcedure;

      returnReader = command.ExecuteReader();

      //Connection.Close();

      return returnReader;

      }

      protected DataSet RunProcedure(string storedProcName, IDataParameter[] parameters,

      string tableName )

      {

      DataSet dataSet = new DataSet();

      Connection.Open();

      SqlDataAdapter sqlDA = new SqlDataAdapter();

      sqlDA.SelectCommand = BuildQueryCommand( storedProcName, parameters );

      sqlDA.Fill( dataSet, tableName );

      Connection.Close();

      return dataSet;

      }

      protected void RunProcedure(string storedProcName, IDataParameter[] parameters,

      DataSet dataSet, string tableName )

      {

      Connection.Open();

      SqlDataAdapter sqlDA = new SqlDataAdapter();

      sqlDA.SelectCommand = BuildIntCommand( storedProcName, parameters );

      sqlDA.Fill( dataSet, tableName );

      Connection.Close();

      }

      道理很簡(jiǎn)單,一看就懂。對(duì)于以后的操作有好處的。

      其次是要建立邏輯層,這個(gè)邏輯層基本上就是實(shí)例化數(shù)據(jù)層DataCore之后為表示層返回一些DataSet,DataReader之類或是執(zhí)行一些insert,update,delete之類語句。這個(gè)邏輯層也是為了區(qū)分整個(gè)Project下面不同功能模塊。比如說用戶模塊起名叫做UserModel.cs,新聞模塊叫做NewsModel.cs之類。邏輯層的另一個(gè)好處就是可以為表示層建立可以多次實(shí)例化的同一個(gè)對(duì)象或是方法。比如說User類,通過ID或是Username 查詢并建立的對(duì)象可以被表示層多次調(diào)用。

      最后是表示層,表示層的功能就是完成頁面邏輯。主要是接受客戶端數(shù)據(jù)然后經(jīng)過簡(jiǎn)單整合和判斷,傳遞給邏輯層處理。同樣,接收邏輯層傳遞來的Dataset或DataReader,表示在前臺(tái)頁面。

      數(shù)據(jù)在各個(gè)層次之間的關(guān)系相對(duì)獨(dú)立,但是又相對(duì)連續(xù)。

      獨(dú)立性:

      對(duì)于表示層之外的幾個(gè)層,都可以把單個(gè)的對(duì)象或是方法直接拿出來放到其他工程中。因?yàn)槊總(gè)曾都是為了實(shí)現(xiàn)模型中獨(dú)立的功能而完成的。因?yàn)樵陬愃乒こ讨械膽?yīng)用基本上不用太大改動(dòng),特別是一些相對(duì)更加原始的層,在這個(gè)示例中的DataCore就是一個(gè)典型的例子。

      連續(xù)性:

      數(shù)據(jù)在傳遞過程中有較強(qiáng)的連續(xù)性。舉一個(gè)例子,在表示層中有這樣一個(gè)根據(jù)Session中Userid返回一個(gè)Dataset,原本我是這樣寫的:

      表示層:

      DataSet UserInforRow = ObjectUser.GetUserInfor(Int32.Parse(Session["UserId"].ToString()));

      邏輯層:

      以下為引用的內(nèi)容:

      public DataSet GetUserInfor(int UserID)
      {

      SqlParameter[] parameters ={new SqlParameter("@UserID",SqlDbType.Int,4)};

      parameters[0].Value = UserID;

      using(DataSet UserInfor = RunProcedure("GetUserInfor",parameters,"UserInfor"))

      {

      return UserInfor;

      }

      }

      這樣可以編譯通過,但是在執(zhí)行的時(shí)候提示錯(cuò)誤,類型不匹配,語法上面沒有錯(cuò)誤。但是錯(cuò)誤出在,表示層傳進(jìn)來的是一個(gè)Int32,在Sqlparameter中確是一個(gè)Int,4,本來以為這樣的變量類型都是在每一個(gè)層次中相對(duì)獨(dú)立的,但是當(dāng)他們之間傳遞數(shù)據(jù)的時(shí)候,出現(xiàn)了問題。對(duì)于這個(gè)問題的解決方案有兩種,無非是更改表示層還是更改邏輯層。更改邏輯層,就要改成
        
        SqlParameter[] parameters ={new SqlParameter("@UserID",SqlDbType.Int,32)};
        
        更改表示層要改為:
        
        DataSet UserInforRow = ObjectUser.GetUserInfor(int.Parse(Session["UserId"].ToString()));
        
        兩個(gè)方案中顯然是更改表示層比較合理,因?yàn)椴荒軌蛞驗(yàn)橐粋(gè)變量的傳遞更改變邏輯層中的可以被其他表示層頁面所調(diào)用的方法。
        
        其他類似的變量傳遞和引用也遇到類似問題,雖然幾個(gè)層次相對(duì)獨(dú)立,但是在數(shù)據(jù)的傳遞上也相對(duì)連續(xù)。
        
        .net在web上面的應(yīng)用可以做的很復(fù)雜,邏輯也很強(qiáng),簡(jiǎn)單的單頁面調(diào)用不是.net的特點(diǎn)也不能作為工程應(yīng)用。我也是接觸了一點(diǎn),冰山一角,希望能起到一個(gè)拋磚引玉的作用,讓大家見笑了。  

      分享:解讀如何在.NET中訪問MySQL數(shù)據(jù)庫(kù)
      引言:如果你不是只在大集團(tuán)公司工作過的話,你一定會(huì)有機(jī)會(huì)接觸到MySQL,雖然它并不支持事務(wù)處理,存儲(chǔ)過程,但是它提供的功能一定能滿足你的大部分需求,另外,簡(jiǎn)潔的MySQL也有一些它獨(dú)

      來源:模板無憂//所屬分類:.Net教程/更新時(shí)間:2009-09-19
      相關(guān).Net教程