這篇文章將為大家詳細(xì)講解有關(guān)如何使用Visual Studio開發(fā)面向經(jīng)典分層架構(gòu)的應(yīng)用程序,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
成都創(chuàng)新互聯(lián)公司于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元雙灤做網(wǎng)站,已為上家服務(wù),為雙灤各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
時(shí)隔一年,繼續(xù)我們的Apworks框架之旅。在接下來的文章中,我將逐漸向大家介紹如何在Visual Studio中結(jié)合Apworks框架,使用ASP.NET Web API和MVC來開發(fā)面向經(jīng)典分層架構(gòu)的應(yīng)用程序。在這一講中,我們首先了解一下分層架構(gòu)的各個(gè)“層”,以及所涉及的Visual Studio項(xiàng)目,然后,我們從領(lǐng)域模型開始,在Visual Studio中開始我們的應(yīng)用程序開發(fā)之旅。
說明:雖然現(xiàn)在微軟已經(jīng)發(fā)布了Visual Studio 2015,但為了照顧廣大的老版本用戶,下面以Visual Studio 2013 with Update 4作為開發(fā)工具進(jìn)行介紹。此外,在某些場景中,會(huì)需要用到Visual Studio 2013 Ultimate的部分功能。
已經(jīng)有一段時(shí)間沒有向大家介紹Apworks框架的相關(guān)內(nèi)容了,在最近的半年中,我對(duì)Apworks做了一些小的重構(gòu),具體內(nèi)容如下:
將支持的.NET Framework升級(jí)到4.5.1
開始在IEntity接口上支持泛型ID,這也就意味著在經(jīng)典分層架構(gòu)的Apworks應(yīng)用中,實(shí)體鍵可以開始支持多種原始數(shù)據(jù)類型了(組合鍵目前仍不支持),比如整形。這一改動(dòng)不會(huì)對(duì)已有的框架產(chǎn)生任何影響,默認(rèn)的實(shí)體鍵類型仍然是Guid
開始在Unit Of Work的具體實(shí)現(xiàn),也就是RepositoryContext上支持異步Commit的操作:可以使用CommitAsync來進(jìn)行異步提交。后續(xù)版本會(huì)支持更多的異步方法
更新所依賴的第三方框架到最新版本(當(dāng)然,在寫這篇文章時(shí),這些第三方框架或許又有了版本更新)
改善了NHibernate Repository的實(shí)現(xiàn)
性能優(yōu)化
您可以直接點(diǎn)擊 https://github.com/daxnet/Apworks 進(jìn)入Apworks框架的開源主頁,也可以使用以下命令獲取Apworks的源代碼:
?
1 | git clone https://github.com/daxnet/Apworks.git
|
我又一次試圖從一個(gè)應(yīng)用案例開始向大家介紹整個(gè)事情的來龍去脈,希望能夠讓大家看清楚并了解到問題的本質(zhì)。我記得之前也有很多文章我也是舉了不少例子,有的文章把例子講解完了,有的又是半途而廢,虎頭蛇尾。好吧,不管怎么樣,沒有案例就無法一步步地將問題解釋清楚。畢竟理論也是需要跟實(shí)踐相結(jié)合的。
這個(gè)案例是一個(gè)個(gè)人便簽應(yīng)用。剛開始的時(shí)候,我把這個(gè)小標(biāo)題稱為《案例:一個(gè)簡單的個(gè)人便簽應(yīng)用》,思索之后將“一個(gè)簡單的”五個(gè)字去掉,我想,簡單的東西不是大家想要的,簡單的東西大家都會(huì)做,聽起來似乎甚至不需要任何框架和工具的輔助,就能簡簡單單地把問題解決掉。我想向大家介紹的是一個(gè)完整的企業(yè)級(jí)應(yīng)用,它不僅應(yīng)該實(shí)現(xiàn)基本的領(lǐng)域邏輯,更應(yīng)該包含諸如安全、性能等各個(gè)方面的內(nèi)容,所以,綜合起來,這事情就簡單不了。
認(rèn)識(shí)我的圈內(nèi)朋友應(yīng)該都知道我自己開發(fā)了一個(gè)基于云的個(gè)人筆記系統(tǒng)Cloud Notes,也有一些文章介紹Cloud Notes的技術(shù)和開發(fā)過程。不錯(cuò),現(xiàn)在我打算使用的這個(gè)案例,它的業(yè)務(wù)背景跟個(gè)人筆記系統(tǒng)很像,但為了介紹技術(shù)部分,我會(huì)讓其業(yè)務(wù)變得更為簡單,也會(huì)介紹一些實(shí)現(xiàn)RESTful服務(wù)的最佳實(shí)踐,因此,該案例會(huì)在技術(shù)架構(gòu)層面與Cloud Notes類似,但也會(huì)有些細(xì)節(jié)上的差異。總而言之,盡量以簡潔的形式來說明問題。
本案例涉及的部分包括用戶和權(quán)限,從業(yè)務(wù)上看,每個(gè)用戶可以管理自己的便簽,內(nèi)容就這么多。太復(fù)雜了會(huì)讓人覺得頭暈?zāi)垦?,也?huì)降低本文的可讀性。OK,讓我們給這個(gè)案例起個(gè)名字,就叫EasyMemo吧。
在我以前的博客中,少不了對(duì)分層架構(gòu)的介紹,尤其是在介紹領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的時(shí)候,還介紹了與之異構(gòu)的基于事件的命令查詢職責(zé)分離(CQRS)架構(gòu)。本案例采用經(jīng)典分層架構(gòu)進(jìn)行開發(fā)。在此,我覺得還是有必要把架構(gòu)圖再簡單畫一下,并且標(biāo)注我們將要使用的微軟技術(shù)。這樣做一方面可以讓大家了解到我們使用了哪些技術(shù),另一方面,在后續(xù)的介紹中,也可以讓大家看到,我們目前是在討論整個(gè)架構(gòu)的哪個(gè)部分。請(qǐng)參見下圖:
可以看到,在整個(gè)案例的介紹過程中,我們將會(huì)使用Entity Framework 6作為數(shù)據(jù)存儲(chǔ)ORM,后臺(tái)數(shù)據(jù)庫選用Microsoft SQL Server,領(lǐng)域模型層適配Apworks框架,應(yīng)用層任務(wù)協(xié)調(diào)使用Apworks框架,而通過ASP.NET Web API 2向外界提供RESTful服務(wù)。表現(xiàn)層采用ASP.NET MVC 4加上AngularJS實(shí)現(xiàn),當(dāng)然會(huì)用到Twitter Bootstrap的一些特性,畢竟在標(biāo)準(zhǔn)的ASP.NET MVC模板中,默認(rèn)安裝了Bootstrap的包。
基本架構(gòu)就這樣,接下來,讓我們一起動(dòng)手開始在Visual Studio 2013中搭建我們的EasyMemo項(xiàng)目吧。
打開Visual Studio 2013,當(dāng)然,目前我們還不需要使用Ultimate版本,因?yàn)榻鉀Q方案的搭建過程不會(huì)涉及任何與Visual Studio 2013 Ultimate相關(guān)的特性。為了能讓解決方案中各項(xiàng)目的組織更為合理,建議首先在Visual Studio 2013中新建一個(gè)空白的解決方案,.NET Framework版本請(qǐng)選擇4.5.1,因?yàn)榻窈笠玫腁pworks框架是基于4.5.1的:
單擊“確定”按鈕后,Visual Studio就會(huì)在【解決方案資源管理器】中顯示一個(gè)空白的解決方案。接下來,我們就相繼往該解決方案中創(chuàng)建以下新項(xiàng)目:
EasyMemo.Common:提供包括公共類型以及基礎(chǔ)結(jié)構(gòu)層的那些可以適用于其它各層的類型和組件
EasyMemo.Domain:包含領(lǐng)域模型的類型,以及這些類型的擴(kuò)展方法
EasyMemo.Repositories:倉儲(chǔ)實(shí)現(xiàn)庫,提供與領(lǐng)域模型對(duì)象倉儲(chǔ)相關(guān)的類型定義以及實(shí)現(xiàn)
EasyMemo.Services:一個(gè)ASP.NET Web API應(yīng)用程序,用以向外界提供RESTful服務(wù)。在【新建項(xiàng)目】對(duì)話中選擇【Visual C# –> Web】分類,在該分類中選擇【ASP.NET Web應(yīng)用程序】,在彈出的【新建ASP.NET項(xiàng)目】對(duì)話框中,選擇【Empty】,在【為以下對(duì)象添加文件夾和核心引用】分組中,選擇Web API:
EasyMemo.Web:EasyMemo的主頁網(wǎng)站,向用戶提供操作界面,接收用戶請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)到RESTful服務(wù)。在【新建項(xiàng)目】對(duì)話中選擇【Visual C# –> Web】分類,在該分類中選擇【ASP.NET Web應(yīng)用程序】,在彈出的【新建ASP.NET項(xiàng)目】對(duì)話框中,選擇【MVC】:
創(chuàng)建完成后,EasyMemo的解決方案中應(yīng)該包含如下5個(gè)項(xiàng)目,每個(gè)項(xiàng)目中都只包含了Visual Studio項(xiàng)目模板自帶的默認(rèn)類型:
為了能夠在編譯整個(gè)解決方案的時(shí)候,讓Visual Studio自動(dòng)下載每個(gè)項(xiàng)目所依賴的NuGet包,強(qiáng)烈建議在EasyMemo解決方案上單擊鼠標(biāo)右鍵,選擇【啟用NuGet程序包還原】選項(xiàng):
現(xiàn)在,我們就從領(lǐng)域模型的設(shè)計(jì)開始,一步步地完成整個(gè)應(yīng)用程序的開發(fā)。
首先,在EasyMemo.Domain項(xiàng)目上,單擊鼠標(biāo)右鍵,選擇【管理NuGet程序包】,在彈出的對(duì)話框的【搜索聯(lián)機(jī)】文本框中,輸入關(guān)鍵字【Apworks】,然后在程序包列表中選擇【Apworks】并單擊【安裝】按鈕:
在安裝時(shí)會(huì)提示許可協(xié)議對(duì)話框,單擊【我接受】按鈕即可。
然后,在EasyMemo.Domain上再新增一個(gè)AggregateRoot抽象類,使其實(shí)現(xiàn)Apworks中的IAggregateRoot接口:
?
1 2 3 4 5 6 7 | using
System;
using
Apworks;
public
abstract
class
AggregateRoot : IAggregateRoot
{
public
Guid ID {
get
;
set
; }
}
|
再新建一個(gè)Account類,使其繼承AggregateRoot類,它表示在EasyMemo整個(gè)應(yīng)用程序中的“用戶賬戶”的概念,為了今后的實(shí)現(xiàn)更為方便快捷,Account類僅提供以下屬性:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | ///
/// 表示EasyMemo中“用戶賬戶”的概念
///
public
class
Account : AggregateRoot
{
///
/// 獲取或設(shè)置賬戶名。
///
public
string
Name {
get
;
set
; }
///
/// 獲取或設(shè)置賬戶密碼。
///
public
string
Password {
get
;
set
; }
///
/// 獲取或設(shè)置郵箱地址。
///
public
string
Email {
get
;
set
; }
///
/// 獲取或設(shè)置顯示名稱。
///
public
string
DisplayName {
get
;
set
; }
///
/// 獲取或設(shè)置賬戶創(chuàng)建日期。
///
public
DateTime DateCreated {
get
;
set
; }
///
/// 獲取或設(shè)置最近一次登錄日期。
///
public
DateTime? DateLastLogon {
get
;
set
; }
}
|
編譯EasyMemo.Domain,編譯通過,表示我們已經(jīng)正常安裝并引用Apworks程序包了,可以繼續(xù)對(duì)領(lǐng)域模型進(jìn)行設(shè)計(jì)了。
關(guān)于如何使用Visual Studio開發(fā)面向經(jīng)典分層架構(gòu)的應(yīng)用程序就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。