封裝業務邏輯:從Web 到WP7的快速開發之道
由于Windows Phone 7的開發技術之一是Silverlight,自然我們會想到,能否將silverlight開發的web程序快速遷移到wp7中,要想實現快速遷移,唯一的辦法是重用。目前大部分網站的開發都是三層架構,顯然UI層面肯定是無法重用的,因為桌面程序和移動應用的UI設計非常不同,能重用的就是業務邏輯層和Model層,這篇文章以一個簡單的在線相片瀏覽器程序為例,演示如何將業務邏輯層進行封裝供Web與WP7使用,以及需要注意的問題。
一個在線照片瀏覽器的開發主要包括三個部分,第一部分是服務器端提供數據模塊,該模塊將照片的信息(比如Uri,照片說明等)以json或xml的格式返回給客戶端,這部分對于web應用和wp7應用都是一樣的,不需要改動。第二個部分是在客戶端的數據獲取模塊,主要是構建數據請求,異步接收數據,解析數據成客戶端需要的數據模型,這部分是我們封裝的重點。第三部分是將獲取的數據與照片瀏覽控件進行綁定,這部分需要在wp7上開發。
首先我們定義簡單的數據模型,主要就是照片的Uri和說明文字,另外還有一個縮略圖的Uri:
public class PhotoItem
{
public Uri ImageUri
{
set { imageUri = value; }
}
public Uri ThumbImageUri { get; set; }
/// <summary>
/// Gets BitmapImage from imageUri.
/// </summary>
public BitmapImage ImageSource
{
get { return new BitmapImage(imageUri); }
}
public string Description
{
get { return description; }
set { description = value; }
}
}
首先定義一個事件參數,用來傳遞請求下來的數據給客戶端頁面程序:
public class RequestEventArgs : EventArgs
{
private bool _loadCompleted;
private object _result;
public object Result { get { return _result; } }
public bool LoadCompleted { get { return _loadCompleted; } }
public RequestEventArgs(bool loadCompleted, object result)
{
this._loadCompleted = loadCompleted;
this._result = result;
}
}
然后用一個PhotoAlbum類來封裝數據的獲取:
public class PhotoAlbum
{
private List<PhotoItem> _photoes;
private Uri _serverUri;
public event EventHandler<RequestEventArgs> PhotoAlbumLoaded;
public void LoadSchedulePhotoes(Uri baseUri)
{
_serverUri = baseUri;
//將Http請求封裝在一個幫助類中,網上有很多這樣的封裝類
HttpHelper httpRequest = new HttpHelper();
httpRequest.CommunicationCompleted += ResponseHandler;
httpRequest.CommunicationFailed += RequestFailedHandle;
httpRequest.ExecuteGet(baseUri.AbsolutePath + "/Controller/action", false); //這里指定Controller和action
}
public void ResponseHandler(string json)
{
//將Json轉換成我們需要的數據類型
List<PhotoItem> _photoes = JsonConvert.DeserializeObject<List<PhotoItem>>(json);
//拿到數據后激發事件
PhotoAlbumLoaded(this, new RequestEventArgs(true, _photoes));
}
public void RequestFailedHandle(string json)
{
//做錯誤處理
}
}
有了上面的東西,在web和wp7程序上,我們只需要簡單的創建一個PhotoAlbum,然后綁定PhotoAlbumLoaded事件,在事件中將參數中的Result綁定到照片瀏覽控件上,然后調用LoadSchedulePhotoes(Uri baseUri)函數即可。
需要注意的是為什么將baseUri作為參數而不直接封裝在類里面,我們知道在Web的silverlight程序,我們可以通過Browser獲取服務器的Uri,但是在WP7的應用程序,我們沒辦法這樣獲得服務器地址,如果在開發web程序中將服務器Uri封裝在業務邏輯類中,在WP7上就沒辦法直接用了。
通過這個簡單的例子,主要想說明的是,在用Silverlight開發RIA應用的時候,我們應該盡量將業務邏輯和數據模型封裝成單獨的dll,并且要充分考慮平臺的不同,這樣能達到重用的目的,實現快速的應用遷移。
浙公網安備 33010602011771號