在web應用開發中,最常見也容易變化的一種需求是根據不同的查詢條件獲取資料列表。如何傳遞查詢條件將影響程式應對需求變化的能力,一定要在架構中重點考慮。
開始時我們使用一堆引數傳遞查詢條件,比如:
list<
sitemsg
>
getmsglist(
intpageindex,
intpagesize,
intrecipientid);
結果,每個不同的查詢都要寫乙個介面,產生了一堆介面;查詢條件改變,介面也隨之要改。寫程式最痛苦的事莫過於介面的頻繁變化。
後來使用查詢對像,比如:
list<
sitemsg
>
getmsglist(sitemsgquery msgquery);
這樣,查詢條件改變時,只需修改sitemsgquery的定義,介面保持不變。採用這個方法後,寫**比之前少了很多痛苦。
但使用這個方法有個地方不爽,完成一次查詢需要進行兩次例項化,一次是查詢物件sitemsgquery的例項化,一次是領域物件sitemsgmanager(負責業務邏輯)的例項化。在程式架構中,查詢物件的例項化是在表現層完成的,如果是ajax呼叫,json會自動反串行為查詢物件;領域物件的例項化在服務層完成。
為了讓**寫的更爽一些,我們又進行了嘗試,取消查詢物件sitemsgquery,將它的屬性放到領域物件中。這樣減少了一次例項化,只需一次,如果是ajax呼叫,可以實現伺服器端「零例項化」。
下面看一下**示例:
領域模型的定義:
[datacontract]public
class
sitemsgmanager
#region
properies
[datamember]
public
intpageindex
[datamember]
public
intpagesize
[datamember]
public
intrecipientid
public
list
<
sitemsg
>
list
#endregion
public
void
getlist()
}
服務實現類(也是wcf的服務實現):
publicclass
msgservice : imsgservice
}
ui層呼叫**(wcf呼叫,asp.net mvc控制器):
publicclass
msgcontroller : controller
public
actionresult inbox()
;
return
view(
"inbox
", getinboxmsglist(msgmanager));
}private
list
<
sitemsg
>
getinboxmsglist(sitemsgmanager msgmanager)
catch
return
sitemsglist;}}
看看上面供ajax呼叫的list方法,不需要進行sitemsgmanager的例項化,系統根據ajax客戶端傳遞過來的json引數自動反序列化生成sitemsgmanager物件。
再來看看ajax客戶端**:
functiongetmsglist(pageindex, pagesize)
msgmanager.pageindex
=pageindex;
msgmanager.pagesize
=pagesize;
$.ajaxsettings.datatype ='
plain/text
';
$.ajaxsettings.url ='
/msg/list';
$.ajaxsettings.data ='
';$.ajaxsettings.success
=function
(data) ;
$.ajax();
}
js傳遞的也是乙個對像。
整個ajax呼叫的流程是這樣的:js物件(msgmanager)->json->msgcontroller(mvc控制器)->**領域物件sitemsgmanager(wcf客戶端**類的例項)->wcf服務介面->wcf服務實現(自動通過反序列化生成領域物件sitemsgmanager,並呼叫getlist()方法)->領域物件完成業務邏輯操作返回資料。
採用這種方法,感覺寫**比以前更享受了。我們在實際開發中也開始使用這種架構,並根據實際使用情況進一步改進。
注:這篇隨筆只是我們在探索web應用架構過程中的筆記,並不代表這是更好更合理的方法。寫出來一是為了分享,二是幫助自己更好的思考,三是記錄架構演變的過程。
web應用基礎架構
中介軟體是一類連線軟體元件和應用的計算機軟體,它包括一組服務。以便執行在一台或多台伺服器上的多個軟體通過網路進行互動。該技術所提供的互操作性,推動了一致分布式體系架構的演進,該架構通常用於支援並簡化那些複雜的分布式應用程式,它包括web伺服器 事務監控器和訊息佇列軟體。中介軟體 middleware...
反應製作的web應用轉場動畫探索
手機端配合反應路線轉場動畫案例初探 用法npm install npm run dll npm run start 說明 核心 e月刊通過transitionname達到頁面接入或者的英文退出的應該執行的動畫 重點說明 reactcsstransitiongroup的中div必須使用style樣式,...
基於AWS雲服務的Web應用架構
高可用和可擴充套件的web應用是複雜而昂貴的。密集的高峰時段和流量模式的劇烈波動導致昂貴的硬體利用率低下。amazon 雲服務為web 應用提供高可靠的,可擴充套件的,安全的高效能基礎設施,同時保證了彈性,根據客戶的流量變化而實時調整規模進而降低了成本。1 amazon route 53 來處理使用...