ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作
 摘要
 ????? 本文將簡要介紹這個文章系列的目的、形式及大體內(nèi)容。并且完成開始學(xué)習(xí)這個系列前所必要的準(zhǔn)備工作。
 
 前言
 ????? ASP.NET MVC作為微軟官方的MVC解決方案,推出有一段時間了。可以說自動推出以來,一直廣受關(guān)注。在經(jīng)歷了漫長的Preview之后,前幾天終于推出了其beta版。并且在官方文檔中,微軟聲明最終的正式版與beta版相比不會有大的變化。所以,對于.NET平臺的開發(fā)人員來說,是時候?qū)W習(xí)ASP.NET MVC了。
 ??????本系列文章作為一個ASP.NET MVC的入門教程,將不會長篇大論介紹其中的概念及理論。而是通過案例實踐來學(xué)習(xí)ASP.NET MVC。在這系列文章中我將逐步完成一個“公告發(fā)布系統(tǒng)”。我的寫作策略是:先動手做,遇到需要解釋概念和理論的時候再解釋,而不是先把概念和理論解釋完再做東西。
 ????? 另外,我還有幾點要說明的:
 ????? 1.為了將大家的關(guān)注點充分集中在ASP.NET MVC上,這個Demo的業(yè)務(wù)處理將使用Mock的方式。即不會真正去訪問數(shù)據(jù)庫,而是虛擬一些數(shù)據(jù)。
 ????? 2.本Demo將不考慮任何美工問題。
 ????? 下面,讓我們一起開始ASP.NET MVC之旅吧。在這一篇中,我們將做完所有的準(zhǔn)備工作。
 
 配置環(huán)境
 ????? 如果您還沒有安裝ASP.NET MVC的話,請到這里下載安裝。
 ????? 下載后,按提示安裝就可以了。
 
 新建項目
 ????? 安裝完ASP.NET MVC后,在VS里新建一個項目,可以看到有一個“ASP.NET MVC Web Application”的選項,選擇它,新建一個項目,并命名為“MVCDemo”。
 ????? 建完項目后,可以看到默認情況下已經(jīng)建立了很多文件夾,這里簡略說一下各個文件夾的作用。
 ????? Content——存放應(yīng)用需要的一些資源文件,如圖片、CSS等。
 ????? Controllers——存放控制器類。
 ????? Models——存放業(yè)務(wù)模型組件。
 ????? Scripts——存放JavaScript腳本文件。
 ????? Views——存放視圖。
 ????? 現(xiàn)在不了解一些概念沒關(guān)系,后續(xù)文章將慢慢解釋。
 
 準(zhǔn)備工作
 ????? 新建完項目后,我們要做的準(zhǔn)備工作就是建立Mock業(yè)務(wù)模型,這樣以后我們就直接使用這些“欺騙”式的業(yè)務(wù)模型進行業(yè)務(wù)處理,而將全部關(guān)注點放在ASP.NET MVC的學(xué)習(xí)上。
 ????? 首先在Models下新建三個文件夾,分別叫做Entities、Interfaces、MockModels,分別用來存放實體類、接口及Mock業(yè)務(wù)模型。
 ????? Entities下有兩個類:CategoryInfo和AnnounceInfo,分別是公告類別和公告的實體類。具體代碼如下:
 CategoryInfo.cs:
using?System.Collections.Generic;
using?System.Linq;
using?System.Web;
namespace?MVCDemo.Models.Entities
{
????///?<summary>
????///?分類實體類
????///?</summary>
????public?class?CategoryInfo
????{
????????public?int?ID?{?get;?set;?}
????????public?string?Name?{?get;?set;?}
????}
}
 
 AnnounceInfo.cs:
using?System.Collections.Generic;
using?System.Linq;
using?System.Web;
namespace?MVCDemo.Models.Entities
{
????///?<summary>
????///?公告實體類
????///?</summary>
????public?class?AnnounceInfo
????{
????????public?int?ID?{?get;?set;?}
????????public?string?Title?{?get;?set;?}
????????public?string?Content?{?get;?set;?}
????????public?int?Category?{?get;?set;?}
????}
}
 
 ????? 接下來,我們將定義兩個接口,分別是公告類別服務(wù)和公告服務(wù)必須實現(xiàn)的接口。這兩個接口放在Interfaces下。
 ICategoryService.cs:
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?MVCDemo.Models.Entities;
namespace?MVCDemo.Models.Interfaces
{
????///?<summary>
????///?分類服務(wù)組件接口
????///?</summary>
????public?interface?ICategoryService
????{
????????///?<summary>
????????///?添加分類
????????///?</summary>
????????///?<param?name="category"></param>
????????void?Add(CategoryInfo?category);
????????///?<summary>
????????///?修改分類名稱
????????///?</summary>
????????///?<param?name="id"></param>
????????///?<param?name="name"></param>
????????void?ChangeName(int?id,string?name);
????????///?<summary>
????????///?刪除分類
????????///?</summary>
????????///?<param?name="id"></param>
????????void?Remove(int?id);
????????///?<summary>
????????///?取得某個分類詳細信息
????????///?</summary>
????????///?<param?name="id"></param>
????????///?<returns></returns>
????????CategoryInfo?GetDetail(int?id);
????????///?<summary>
????????///?取得所有分類
????????///?</summary>
????????///?<returns></returns>
????????List<CategoryInfo>?GetAll();
????}
}
 
 IAnnounceService.cs
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?MVCDemo.Models.Entities;
namespace?MVCDemo.Models.Interfaces
{
????///?<summary>
????///?公告服務(wù)組件接口
????///?</summary>
????public?interface?IAnnounceService
????{
????????///?<summary>
????????///?發(fā)布公告
????????///?</summary>
????????///?<param?name="announce"></param>
????????void?Release(AnnounceInfo?announce);
????????///?<summary>
????????///?修改公告信息
????????///?</summary>
????????///?<param?name="announce"></param>
????????void?Notify(AnnounceInfo?announce);
????????///?<summary>
????????///?刪除公告
????????///?</summary>
????????///?<param?name="id"></param>
????????void?Remove(int?id);
????????///?<summary>
????????///?取得公告詳細內(nèi)容
????????///?</summary>
????????///?<param?name="id"></param>
????????///?<returns></returns>
????????AnnounceInfo?GetDetail(int?id);
????????///?<summary>
????????///?取得某個分類下的所有公告
????????///?</summary>
????????///?<param?name="categoryId"></param>
????????///?<returns></returns>
????????List<AnnounceInfo>?GetByCategory(CategoryInfo?category);
????}
}
 
 然后,我們在MockModels下建立兩個Mock業(yè)務(wù)邏輯服務(wù)模型。注意它們要各自實現(xiàn)自己的接口。
 MockCategoryService.cs:
using?System.Collections.Generic;
using?System.Linq;
using?System.Web;
using?MVCDemo.Models.Interfaces;
using?MVCDemo.Models.Entities;
namespace?MVCDemo.Models.MockModels
{
????///?<summary>
????///?“欺騙”服務(wù)組件,用于模擬分類的業(yè)務(wù)服務(wù)
????///?</summary>
????public?class?MockCategoryService?:?ICategoryService
????{
????????///?<summary>
????????///?添加分類
????????///?</summary>
????????///?<param?name="category"></param>
????????public?void?Add(CategoryInfo?category)
????????{
????????????return;
????????}
????????///?<summary>
????????///?修改分類名稱
????????///?</summary>
????????///?<param?name="id"></param>
????????///?<param?name="name"></param>
????????public?void?ChangeName(int?id,?string?name)
????????{
????????????return;
????????}
????????///?<summary>
????????///?刪除分類
????????///?</summary>
????????///?<param?name="id"></param>
????????public?void?Remove(int?id)
????????{
????????????return;
????????}
????????///?<summary>
????????///?取得某個分類詳細信息
????????///?</summary>
????????///?<param?name="id"></param>
????????///?<returns></returns>
????????public?CategoryInfo?GetDetail(int?id)
????????{
????????????return?new?CategoryInfo
????????????{
????????????????ID?=?id,
????????????????Name?=?"最新通告",
????????????};
????????}
????????///?<summary>
????????///?取得所有分類
????????///?</summary>
????????///?<returns></returns>
????????public?List<CategoryInfo>?GetAll()
????????{
????????????List<CategoryInfo>?categories?=?new?List<CategoryInfo>();
????????????for?(int?i?=?1;?i?<=?5;?i++)
????????????{
????????????????CategoryInfo?category?=?new?CategoryInfo
????????????????{
????????????????????ID?=?i,
????????????????????Name="通告類別"+i,
????????????????};
????????????????categories.Add(category);
????????????}
????????????return?categories;
????????}
????}
}
 
 MockAnnounceService.cs
using?System.Collections.Generic;
using?System.Linq;
using?System.Web;
using?MVCDemo.Models.Interfaces;
using?MVCDemo.Models.Entities;
namespace?MVCDemo.Models.MockModels
{
????///?<summary>
????///?“欺騙”服務(wù)組件,用于模擬公告的業(yè)務(wù)服務(wù)
????///?</summary>
????public?class?MockAnnounceService?:?IAnnounceService
????{
????????///?<summary>
????????///?發(fā)布公告
????????///?</summary>
????????///?<param?name="announce"></param>
????????public?void?Release(AnnounceInfo?announce)
????????{
????????????throw?new?Exception("發(fā)布公告失敗了!原因?沒有原因!我是業(yè)務(wù)組件,我說失敗就失敗!");
????????????return;
????????}
????????///?<summary>
????????///?修改公告信息
????????///?</summary>
????????///?<param?name="announce"></param>
????????public?void?Notify(AnnounceInfo?announce)
????????{
????????????return;
????????}
????????///?<summary>
????????///?刪除公告
????????///?</summary>
????????///?<param?name="id"></param>
????????public?void?Remove(int?id)
????????{
????????????return;
????????}
????????///?<summary>
????????///?取得公告詳細內(nèi)容
????????///?</summary>
????????///?<param?name="id"></param>
????????///?<returns></returns>
????????public?AnnounceInfo?GetDetail(int?id)
????????{
????????????return?new?AnnounceInfo
????????????{
????????????????ID?=?id,
????????????????Title?=?"第"?+?id?+?"則公告",
????????????????Content?=?"全體同學(xué)明早九點集體做俯臥撐!",
????????????};
????????}
????????///?<summary>
????????///?取得某個分類下的所有公告
????????///?</summary>
????????///?<param?name="categoryId"></param>
????????///?<returns></returns>
????????public?List<AnnounceInfo>?GetByCategory(CategoryInfo?category)
????????{
????????????List<AnnounceInfo>?announces?=?new?List<AnnounceInfo>();
????????????for?(int?i?=?1;?i?<=?10;?i++)
????????????{
????????????????AnnounceInfo?announce?=?new?AnnounceInfo
????????????????{
????????????????????ID?=?i,
????????????????????Title?=?category.Name+?"的第"?+?i?+?"則公告",
????????????????????Content?=?"全體同學(xué)明早九點集體做俯臥撐!",
????????????????};
????????????????announces.Add(announce);
????????????}
????????????return?announces;
????????}
????}
}
 
 ????? 可以看到,這兩個類并沒有訪問數(shù)據(jù)庫,也沒有實現(xiàn)真正的業(yè)務(wù)邏輯,而不過是“捏造”了一些數(shù)據(jù)騙騙我們的表示層而已。
 ????? 最后,我們要建立一個生成業(yè)務(wù)邏輯模型的生成器,用來實現(xiàn)表示層和業(yè)務(wù)邏輯層的解耦。當(dāng)然,為了簡化復(fù)雜度,這里沒有使用依賴注入機制。下面是我們生成器的代碼,這個類是直接放在Models下的。
 ServiceBuilder.cs:
using?System.Collections.Generic;
using?System.Linq;
using?System.Web;
using?MVCDemo.Models.Interfaces;
using?MVCDemo.Models.MockModels;
namespace?MVCDemo.Models
{
????///?<summary>
????///?服務(wù)組件生成類,用于生成業(yè)務(wù)服務(wù)組件
????///?</summary>
????public?sealed?class?ServiceBuilder
????{
????????///?<summary>
????????///?創(chuàng)建分類服務(wù)組件
????????///?</summary>
????????///?<returns>分類服務(wù)組件</returns>
????????public?static?ICategoryService?BuildCategoryService()
????????{
????????????return?new?MockCategoryService();
????????}
????????///?<summary>
????????///?創(chuàng)建公告服務(wù)組件
????????///?</summary>
????????///?<returns>公告服務(wù)組件</returns>
????????public?static?IAnnounceService?BuildAnnounceService()
????????{
????????????return?new?MockAnnounceService();
????????}
????}
}
 
 ????? OK,到這里,我們的準(zhǔn)備工作就做完了。完成這些后,系統(tǒng)的目錄結(jié)構(gòu)如下圖所示:
????? 在這篇文章中,我們只是講了一下這個系列文章要做什么,以及為案例做了一些準(zhǔn)備工作。從下篇開始,我們將正式開始使用ASP.NET MVC完成這個案例。
from:?http://www.cnblogs.com/leoo2sk/archive/2008/10/27/1320285.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 分类模型的性能评估——以SAS Logi
- 下一篇: ASP.NET MVC案例教程(基于AS
