asp.net程式編程機制

來源:互聯網
上載者:User

首先asp.net應用程式是三層結構的,展示層 - 業務層 - 資料訪問層,這個是大家經常採用的模式,但我在層之間加了些處理,主要是處理層與層之間的資料轉送。下面是每層詳細的內容。

業務層是一種商務邏輯的體現,與展示層無關,一般是一個類,包含業務的資料及相應的各種業務操作。業務層一般不直接調用資料訪問層,而是通過一個資料訪問服務類AccessService來調用,這樣的話,資料訪問層必須實現一定的介面IAccess(操作有LOAD,INSERT,UPDATE,DELETE)。當業務類要載入資料的時候,先把類的資料(一般是參數)打成一個包,然後調用AccessService的LOAD方法來調用資料訪問層IAccess的LOAD操作,IAccess把資料從資料庫讀取出來,在打成個包,返回給AccessService,在返回給業務層,業務層把資料包解包後,資料變成業務層的資料(就是業務類的屬性)。到這時完成業務資料的載入。之後在做相應的業務操作,在把資料打成包丟給AccessService處理,儲存到資料庫中。

為什麼在業務層和資料層中間在加入一個AccessService,目的是為了降低層之間的偶合度,就是業務層和資料層無之間關聯,資料層只是負責把資料永久化,與具體的業務也無關。如果要改動資料庫類型,只要變動資料層就好了。

另資料層也不是直接存取資料庫的,而是通過一個通用的DataServiceForSqlServer(SQL SERVER資料庫的資料訪問類),這個很多人都有的,就是些基本的操作,如ExecuteNonQuery、ExecuteDataSet、ExecuteReader 等。

asp.net採用介面很代碼分離的方式來實現的,很多從asp轉向asp.net都習慣把代碼寫到aspx檔案裡面,或者某些方法還是採用asp的方式,那是不可取的。asp.net採用ViewState的機制來實現頁面內狀態的延續。大家知道WEB是無狀態的,就是說當一個頁面載入完成後,所有的頁面對象將被丟棄,以HTML的方式把資料返回給瀏覽器。當瀏覽器發出請求,伺服器根據請求,建立各種對象,處理對象,在把資料以HTML的方式返回給瀏覽器,所以說頁面是無狀態的,伺服器根本不知道頁面的上一個狀態是什麼。asp.net則採用VIEWSTATE來讓伺服器知道前一個頁面的狀態。這裡說的頁面都是同一個頁面。asp.net一般把一種功能放在同一個頁面,而asp一般都要採取多頁的方式。

那麼在asp.net,是怎麼實現狀態的延續的?這個要瞭解下ASP.net控制項的生命週期(PAGE類也是個控制項類)。當瀏覽器發出第一次請求,伺服器做了如下的工作:

  Init 初始化(建立控制項樹等初始化工作)
  LoadViewState 載入檢視狀態(因為第一次,這時檢視狀態為空白)
  LoadPostData 處理回傳資料(就是表單資料,因為在server,控制項是以WEBCONTROL存在的,這時把表單的資料轉換成控制項的資料)
  Load 載入 (這裡你可以編寫你自己的初始化工作)
  RaisePostDataChangedEvent 發送回傳更改通知(引發變更事件以響應當前和以前回傳之間的狀態更改)
  RaisePostBackEvent 處理回傳事件(處理引起回傳的用戶端事件,並在伺服器上引發相應的事件。如button的onClick事件是這時處理的)
  PreRender 預呈現(在呈現輸出之前執行任何更新。如果在這個事件後面調用任何對WEBCONTROL或VIEWSTATE的更新都將會丟失)
  SaveViewState 儲存狀態(就是把當前的頁面狀態儲存下在)
  Render 呈現(產生呈現給用戶端的輸出,就是以HTML的方式返回給瀏覽器,其中的檢視狀態的資料以隱藏表單的方式儲存,名稱為“__VIEWSTATE”)
  Dispose 處置(執行銷毀控制項前的所有最終清理操作)
  UnLoad 卸載

費了一大對口舌講上面的東西,目的只是弄清楚asp.net的機制。

接來說說展示層。展示層只做簡單的資料驗證和時間處理,不處理業務,而由業務層處理。在第一次載入的時候,將建立與頁面有關的業務對象,並把資料繫結到介面的webcontrol,完成資料的載入。這個有兩種方式,一種把這個業務對象也以視圖的方式儲存起來,並修改資料,等發出儲存處理命令在提交到資料庫;另在發出儲存處理命令後在創立原來的業務對象,在修改資料提交到資料庫。前者可以減少資料庫訪問的次數,都由於對象儲存在VIEWSTATE(這裡有個序列化的問題),每次伺服器和用戶端往返的資料較多。

展示層的一個業務事件一般可以到業務層的一個業務操作,這樣展示層就不用管具體的業務是怎麼是實現的。另我在中間還做了個處理,就是這麼把表單的值賦到業務類的屬性去(就是把值轉化為業務資料,中間還有個資料類型轉化的問題)。我是通過BinderReflectService 的服務,實現轉化的,大概是怎麼實現的:在業務類有個BinderMappingCollection 對象,記錄業務類的屬性名稱,以及相關的控制項名稱,BinderReflectService會自動擷取控制項的資料,並賦值給指定的屬性。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.