工作繁忙,很久沒有更新部落格了。下面言歸正傳,簡單介紹一下Tiny Library的使用者介面實現。
如前所述,Tiny Library採用ASP.NET MVC架構實現了基於瀏覽器的使用者介面。回顧一下《商務邏輯與系統結構》一文,從層次架構圖中我們可以清楚地看到,使用者介面層是通過WCF Services與系統互動的。
為了快速簡單地實現Tiny Library,我只是簡單地使用了ASP.NET MVC,因此沒有對其做更深入的挖掘,有關ASP.NET MVC的更多知識,請朋友們自行上網搜尋或閱讀相關書籍。
這裡需要說明的問題有兩點:使用者認證與授權,以及MVC中的M。
使用者認證與授權(Authentication & Authorization)
ASP.NET MVC採用基於Forms的認證機制(Forms Authentication),因此Tiny Library也繼承了這種方式。事實上,使用ASP.NET MVC的這種認證機制,會在網站的App_Data目錄下產生一個ASPNETDB.MDF的資料庫檔案,用來儲存Authentication相關資訊,比如某個使用者註冊了,就會在這個資料庫中產生相關資訊。然而,我們的Tiny Library也有一套自己的資料庫,該庫中需要儲存使用者的相關資訊(比如Reader的名字等),目前我是在AccountController中,Register使用者的時候,同時在Tiny Library中同步一條資料,代碼如下:
隱藏行號 複製代碼 ? Register User
MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email);
if (createStatus == MembershipCreateStatus.Success)
{
TinyLibraryServiceClient svcClient = new TinyLibraryServiceClient();
bool ret = svcClient.AddReader(new ReaderData
{
Id = Guid.NewGuid(),
Name = model.Name,
UserName = model.UserName
});
svcClient.Close();
if (ret)
{
FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
return RedirectToAction("Index", "Home");
}
else
{
}
}
else
{
ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
}
這樣做其實很不保險,比如,如果在Tiny Library資料庫中添加使用者資訊失敗,那麼雖然使用者成功註冊(提交ASPNETDB.MDF成功),也無法正常使用系統。當然,Tiny Library只是個示範系統,如果是在實際應用中,這個問題還需要通過其他途徑解決。我目前沒有想到萬全之策,歡迎熱心的朋友在本文的留言中給出建議。
MVC中的M(Model)
有不少使用ASP.NET MVC的朋友,總會將Domain Model帶到使用者介面層,然後直接將Domain Model中的實體用作MVC中的M。在Fowler的PoEAA一書的DTO一章已經說過,Domain Model是不能暴露給高層的,因此將Domain Model中的實體用於MVC是不合理的。
其實如果你有瞭解過CQRS體繫結構模式,你就會瞭解到,MVC中的M,應該是Presentation Model,這個Presentation Model與領域毫無關係,僅僅用於介面資料繫結。在MVC Web Application添加了WCF的Service Reference之後,當你建立View的時候,你就可以很方便地將用戶端產生的Data Contract用作Data Class,如下:
其實,這裡列出來的BookData、ReaderData和RegistrationData,就是Model。
OK,使用者介面就寫這麼些吧,也沒有採用什麼特別的技術,主要還是使用ASP.NET MVC上的這幾個問題。有關ASP.NET MVC的內容,朋友們請自己查閱相關資料吧!