.NET Magazine國際中文電子雜誌
作 者:羅慧真
審 稿:張智凱
文章編號:N141015301
出刊日期:2014/10/8
開發工具:Visual Studio 2013
版本:Windows Runtime 1.1
現在真是一個便利的世代,手機、平板等行動裝置提供設備輕盈、軟體多樣化及便利的特色,再加上現在是個 WiFi 化的城市幾乎到哪裡都有可連結的網路,因此幾乎人人手上有手機、平板等行動裝置,街頭上的人們等車有它陪著、等人無聊時有它伴著…。
在行動裝置如此普及化的時代裡,有沒有想過與你企業的應用可以產生什麼關聯嗎?可以做的事實在很多,像是賣場可以提供產品速查、促銷通知、商品架位 … ,業務、行銷人員、餐廳外場工作人員,可以提供客戶查詢、訂單查詢、點餐系統 … 上次去某家連鎖餐廳吃飯看到點餐人員真的是使用手機幫客戶點餐,在醫療體系裡、在警察、警衛巡邏、快遞等行業應該也可以看到不少的應用 …
不過目前我們可以看到的行動 App 好像是遊戲、社群軟體居多,有許多企業也慢慢在跟進中 … 事實上企業的行動 App 比一般消費型App 有更大的挑戰,它可能會有隨時需要更新的資料,可能需要一個適合的身分驗證與授權的需求,更可能遇到網路離線的狀態。
要如何將各類型的資料與使用者的行動裝置連結起來呢? 這是一個好問題。
我們來看看Microsoft Window Azure 行動服務提出的解決方式:
- 解決沒有網路時的窘境
配合SQLite API離線存取,連線同步的機制 - SQLite 作為本地儲存機制
內建異動追蹤、衝突處理的功能 - 認證與 Azure 的AD整合及跨平台的推送通知
Window Azure 行動服務可以做為資料提供的服務站台,可以連線時資料從服務網站下載並且將資料使用SQLite API存到本地,在離線狀態時使用SQLite中的資料查詢及異動,當有網路時可以在連上雲端使用同步機制將資料更新到雲端服務,SQLite 有內建異動追蹤、衝突處理的功能,在離線狀態的黑暗期資料產生的差異SQLite API 都可以抓出來處理。同時它也支援認證與 Azure 的AD整合及跨平台的推送通知。
無論如何,這裡有兩個選項提供離線資料的解決方案,一個是NoSQL、一個是SQLite。
NoSQL
NoSQL 沒有使用到任何資料庫引擎的功能,純在 WinRT 的API,像是HttpClient、File、Stream,序列化相關類別…,將Web 服務的資料下載之後透過序列化/反序列化將資料存到本地磁區。
SQLite
這是一個目前最流行的行動資料庫,它支援多種平台,像是iOS, Android, Python, Mono, Windows 等…。是一種內嵌式、in-process的檔案行資料庫引擎。同時具備小型,快速,可靠,與公共領域支援交易處理 ACID等特色。
那麼要如何使用Window Azure 行動服務呢?
首先進入Window Azure網頁並登入到行動服務的入口(http://azure.microsoft.com/zh-tw/,若沒有帳號可以申請免費試用一個月),新增一個行動服務,接著在以下的畫面中設定一個唯一的 URL 位置,並且在【資料庫】的下拉選項中選取一個既有的或建立新的資料庫,然後在【地區】的下拉選項中選取資料庫要放置在雲端伺服器的位置,接著在【後端】的下拉選項選擇使用 【.NET 】。
按下方的下一步箭頭按鈕,進到指定資料庫設定,指定一個唯一的資料庫名稱,指定資料庫所在的伺服器(選擇【既有的或是建立新的】),然後設定伺服器的登入帳號及密碼(請使用複雜性密碼),並指定伺服器儲存地區。
然後點按右下方的勾勾完成設定,此時雲端會根據需求開始建置資料庫伺服器及資料庫,請耐心等候,當它建置完成後你會看到如下的畫面。
下載行動服務的專案檔
完成資料庫設定之後,進入行動服務的項目中,在【開始使用】的畫面中下載服務的專案,有兩個選項【建立新的Windows 或 Windows Phone應用程式】,一個是【連線到現有的 Windows 或 Window Phone 應用程式】,我們選擇後者,展開之後會出現【下載】按鈕,按下後會開始下載專案的壓縮檔,解壓縮之後開啟 .csproj 的專案檔。
Web API 定義物件模型及Controller
這個下載的專案是一個 Web API 的專案,當這個專案開發完成時你會將它佈署到雲端(行動服務)。請使用Visual Studio 開啟這個下載的專案,在DataObjects 的資料夾中加入一個類別取名為 Student ,程式碼如下:
using Microsoft.WindowsAzure.Mobile.Service;
namespace Win309Service.DataObjects
{ // 定義資料表的結構
public class Student : EntityData
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
這的類別必須繼承EntityData ,並且定義預備用來作為資料表的結構,這個範例預備要建立一個Student的資料表,並且有兩個欄位分別是FirstName、LastName。完成類別的撰寫請建置專案。
接著為這個 Student類別建立一個Web API的控制器 (Controller),以提供外界對 Student資料表內容的新增、刪除、修改等維護功能。在 Controllers資料夾的位置按滑鼠右鍵選取【新增】à【控制器】,然後再出現的【新增Scaffold】視窗選取【Microsoft Azure 行動服務資料表控制器】並且按下方的【新增】。
接著出現【新增控制器】的畫面,在【模型類別】的下拉清單選取Student(若是清單未出現你要的類別,請確認寫完Student類別有沒有成功的完成建置),接著在【資料內容類別】的下拉清單選取 Context物件,在【控制器名稱】輸入 StudentController,按下【新增】即可完成 Controller 的建立。
完成之後會產生以下程式碼:
public class StudentController : TableController<Student>
{
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
Win309Context context = new Win309Context();
DomainManager = new EntityDomainManager<Student>(context, Request, Services);
}
// GET tables/Student
public IQueryable<Student> GetAllStudent()
{
return Query();
}
// GET tables/Student/48D68C86-6EA6-4C25-AA33-223FC9A27959
public SingleResult<Student> GetStudent(string id)
{
return Lookup(id);
}
// PATCH tables/Student/48D68C86-6EA6-4C25-AA33-223FC9A27959
public Task<Student> PatchStudent(string id, Delta<Student> patch)
{
return UpdateAsync(id, patch);
}
// POST tables/Student/48D68C86-6EA6-4C25-AA33-223FC9A27959
public async Task<IHttpActionResult> PostStudent(Student item)
{
Student current = await InsertAsync(item);
return CreatedAtRoute("Tables", new { id = current.Id }, current);
}
// DELETE tables/Student/48D68C86-6EA6-4C25-AA33-223FC9A27959
public Task DeleteStudent(string id)
{
return DeleteAsync(id);
}
}
此程式提供透過http的方式查詢Student資料表(GetAllStudent、GetStudent方法)、新增(PostStudent方法)、修改(PatchStudent方法)、刪除(DeleteStudent方法)。在Visual Studio按 F5 執行程式,它會打開一個測試網頁,點按【try it out】,在下一頁點按Get tables/Student的Hyper Link,轉到下一頁,點按上方的【try this out】,得到如下的結果:
測試程式會將資料以json格式輸出在body的位置,因為目前資料庫沒有資料故body區塊是空白。在我們第一次執行程式時,Entity Framework已經將我們的資料表建立完成了,可以使用【伺服器總管】查看,回到Visual Studio,開啟【伺服器總管】應該已經自動被連結在【資料連接】的項目中,展開便可看到Students資料表,它是根據前面所寫的Student類別所建立的。
API 會自動為另加Id、Version、CreatedAt、UpdatedAt 等欄位以作為資料的識別及更新版本的衝突處理。目前尚未填入任何資料所以資料表是空的。
Web API 行動服務及資料表已經建置完成,這是第一階段的任務。用戶端這裡打算使用Windows Store App及 Windows Phone Store App 來說明如何與 NoSQL、SQLite的應用。篇幅有限今天就在這裡打住,我將在下一篇說明NoSQL與Windows Phone Store App。