一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

結(jié)合領(lǐng)域驅(qū)動設(shè)計的SOA分布式軟件架構(gòu)

  引言

  本文主要是參考Martion Fowler所著的《企業(yè)應(yīng)用架構(gòu)模式》與Eric Evans所著的《領(lǐng)域驅(qū)動設(shè)計》這兩本泰山之作,加上本人在近年實際的工作過程中開發(fā)SOA系統(tǒng)所認識到的問題所寫的一篇文章,歡迎各位點評。

  最后兩節(jié)  細說應(yīng)用層 、系統(tǒng)總體架構(gòu) 是本文的重點,著重說明領(lǐng)域驅(qū)動設(shè)計與SOA之間的關(guān)系,對DDD有一定基礎(chǔ)的朋友可以越過前面的幾節(jié),直接查看第七、八節(jié)。

  源代碼下載 (數(shù)據(jù)庫可以在.edmx文件根據(jù)模型生成)

  一、SOA與DDD的定義

  SOA與DDD都是常用的系統(tǒng)架構(gòu),但兩者之間所針對的核心是不同的。

  SOA(面向服務(wù)架構(gòu))由Gartner在1996年提出來,它是一種分布式的軟件架構(gòu),它可以根據(jù)需求通過網(wǎng)絡(luò)對松散耦合的粗粒度應(yīng)用組件進行部署、組合和使用。簡單來說,SOA就是一種大型系統(tǒng)開發(fā)的體系架構(gòu),在基于SOA架構(gòu)的系統(tǒng)中,具體應(yīng)用程序的功能是由一些松耦合并且具有統(tǒng)一接口的組件(也就是service)組合構(gòu)建起來的,它是針對多核心多平臺之間的數(shù)據(jù)交換。

  DDD(領(lǐng)域驅(qū)動設(shè)計)由Eric Evans在2004提出,它的核心內(nèi)容是“如何將業(yè)務(wù)領(lǐng)域概念映射到軟件工程當(dāng)中”。它推翻了“軟件從數(shù)據(jù)層開發(fā)設(shè)計”的舊習(xí)慣,強調(diào)領(lǐng)域模型在軟件中發(fā)揮的強大力量,注重如何把企業(yè)內(nèi)部復(fù)雜的業(yè)務(wù)流程轉(zhuǎn)化為軟件。

  也許可以認為SOA針對的是大型系統(tǒng)的總體架構(gòu),注重如何把系統(tǒng)進行項目分離,隔離開發(fā),最后實現(xiàn)系統(tǒng)合并。而DDD是針對單個項目的開發(fā)管理過程,注重如何利用領(lǐng)域模型把業(yè)務(wù)需求轉(zhuǎn)化為軟件。兩者之間并沒有存在理論上的沖突,能把兩者結(jié)合,各展所長,更能發(fā)揮各自的優(yōu)勢。

  二、DDD的分層結(jié)構(gòu)

  1. 概念

  從概念上來說,領(lǐng)域驅(qū)動設(shè)計架構(gòu)主要分為基礎(chǔ)設(shè)施層、領(lǐng)域?qū)印?a href=/pingce/yingyong/ target=_blank class=infotextkey>應(yīng)用層、表現(xiàn)層4個概念層。

  基礎(chǔ)結(jié)構(gòu)層:是為各層提供各項通用技術(shù)能力而構(gòu)建的,它可以為領(lǐng)域?qū)犹峁┫馠ibernate、LINQ、ADO.NET等持久化機制,為應(yīng)用層傳遞消息,為表現(xiàn)層提供插件等等。

  領(lǐng)域?qū)樱核窍到y(tǒng)的核心部分,代表業(yè)務(wù)的邏輯概念。它會根據(jù)業(yè)務(wù)的實際流程定制了業(yè)務(wù)信息以及業(yè)務(wù)規(guī)則,并按一定的關(guān)系制定領(lǐng)域模型。領(lǐng)域模型盡管需要依賴基礎(chǔ)結(jié)構(gòu)層進行保存,但領(lǐng)域模型之間的邏輯關(guān)系是跟基礎(chǔ)結(jié)構(gòu)層相隔離的。即使基礎(chǔ)結(jié)構(gòu)層從NHibernate技術(shù)轉(zhuǎn)換成LINQ技術(shù),也不會影響到領(lǐng)域?qū)拥慕Y(jié)構(gòu)。領(lǐng)域模型只會依賴實際的業(yè)務(wù)邏輯,它只會根據(jù)業(yè)務(wù)的轉(zhuǎn)變而靈活變動。

  應(yīng)用層:它的任務(wù)是協(xié)調(diào)領(lǐng)域?qū)优c表現(xiàn)層之間的關(guān)系,也可以作為系統(tǒng)與外界溝通的橋梁,在這層里面不會包括任何的業(yè)務(wù)邏輯。在SOA面向服務(wù)架構(gòu),這一層起著重要的作用,在第七節(jié)將詳細說明。

  表現(xiàn)層:它是常用的界面開發(fā),可以以頁面(ASP.NET、JSP),窗口(WinForm、WPF、Swing)等形式表現(xiàn),它的主要職責(zé)是負責(zé)與用戶進行信息溝通。(注意:在一般的項目開發(fā)中,Web服務(wù)會作為與外界通訊的接口放置在表現(xiàn)層中,但在SOA中,Web服務(wù)會大多置于應(yīng)用層中,下面將會作進一步解釋)

  2. 開發(fā)實例

  在此先舉個常見的訂單管理例子,在下面的章節(jié)里都會以這個實例為參考:

  每個用戶在Person表里面都會有一個對應(yīng)的帳戶,里面記錄了用戶的姓名、地址、電話、積分(Point)等基本信息。

  在Order表里記錄的是每次交易的過程,每次商品的送貨費(Freightage)為10元,當(dāng)商品價格(Price)超過98元可免費送貨,當(dāng)用戶Person積分(Point)超過2000分可獲7折優(yōu)惠(Favorable),1000~2000分可獲8折,1000分以下可有9折,最后總體價格為為(TotalPrice)。

  在最后結(jié)單的時候Order表里會產(chǎn)生訂單號碼OrderNumber和下訂日期Delivery,Person表的積分也會加上訂單總價的點數(shù)。

  最后OrderItem表包含了物品Goods、物品價格Price、購買數(shù)量Count等屬性,它主要記錄每次訂單的詳細交易狀況。

  上面的業(yè)務(wù)邏輯跟淘寶、當(dāng)當(dāng)?shù)鹊却笮唾徫锞W(wǎng)基本相似。之所以用這樣一個例子作為參考,是想表現(xiàn)一下DDD是如果利用領(lǐng)域模型去適應(yīng)多變的業(yè)務(wù)邏輯關(guān)系。

  三、把業(yè)務(wù)關(guān)系轉(zhuǎn)化為領(lǐng)域模型

  1. 概念

  模型驅(qū)動設(shè)計(MODEL-DRIVEN-DESIGN)是DDD里面的核心,它代表的是各個對象之間的關(guān)系,把復(fù)雜的邏輯關(guān)系轉(zhuǎn)化為模型。

  模型主要分為實體(Entity)、值對象(Value Object)與服務(wù)(Service)三種。

  實體:實體所包含的不單止是一連串的屬性,更重要的是與事件的聯(lián)系,在一個生命周期中環(huán)境的變化與事件發(fā)生,將引起實體內(nèi)部產(chǎn)生變化。好像在實體Order里面,Person的積分(Point)和OrderItem的價格(Price)都會直接影響總體價格(TotalPrice)的大小,而總體價格也會影響到運費Freightage的多少等等。在Order實體的一切,都會受到Person、OrderItem等這些外部因數(shù)的影響,這樣的對象被視為實體。在不同的時刻,實體會有不同的狀態(tài),所以在開發(fā)過程中我們需要為實體加上一個“標識符”來區(qū)分對象的身份,它是實體的生命周期里的唯一標志。

  值對象:當(dāng)所用到的對象只有屬性而沒有其他邏輯關(guān)系的時候,我們就可以把它視為是值對象。值對象沒有狀態(tài),也不需要有 “標識符”。在多數(shù)情況下它可以作為一個屬性存在于一個實體的內(nèi)部。一般情況下值對象的屬性是不可改變的,當(dāng)需要更改屬性時,可以把整個對象刪除,然后重新加入一個新對象。

  服務(wù):當(dāng)實體之間存在某些操作,它們并不單一地附屬于某一個實體,而是跟多個實體都有關(guān)聯(lián)的時候,就可以使用服務(wù)來封裝這些操作。值得注意的是服務(wù)并非單獨指Web Service, 也并非單單存在于領(lǐng)域?qū)樱窃诟鱾€層當(dāng)中都會存在服務(wù),每一層的服務(wù)都有著不同的職能。在基礎(chǔ)結(jié)構(gòu)層服務(wù)可能是用于構(gòu)建身份驗證、電子郵件、錯誤處理等等操作;在領(lǐng)域?qū)樱?wù)更多時候是一種操作,它用于協(xié)調(diào)多個實體之間的關(guān)系,處理各類的業(yè)務(wù)問題;在應(yīng)用層(特別是在分布式開發(fā)系統(tǒng)內(nèi)),服務(wù)多以Web Service、TCP/IP套接字、MSMQ等等方式實現(xiàn),服務(wù)在此處會作為一個與外界通訊的接口。

  • 備注 :這里面也存在一定的爭義,Eric 認為實體所代表的只是多個對象之間的關(guān)系,而它們的動作將會由服務(wù)來體現(xiàn)出來,這被稱為貧血型模型。但在開發(fā)過程中,越來越多人會把動作加入到實體里面,這被稱為充血型模型。其實不同的問題應(yīng)該客觀分析,分別對待,在這個例子里面將會以按照 Eric 的定義來開發(fā)服務(wù),在后面的開發(fā)過程中大家也可以從中體現(xiàn)一下服務(wù)層所帶來的好處。

  2. 實例說明

  先以ADO.NET Entity Framework實現(xiàn)模型,Person、Order分別屬于兩個實體,它們都將繼承Root接口,在它們的生命周期內(nèi)都會生成一個Guid作為標志。此處把OrderItem作為一個值對象置于Order實體內(nèi),這意味著OrderItem會通過Order來獲取,外界不能跨越Order直接獲取OrderItem。當(dāng)然這應(yīng)該由具體的業(yè)務(wù)情況來確定,當(dāng)外界需要單獨調(diào)用OrderItem類的時候,就應(yīng)該考慮把OrderItem獨立成為一個實體類。

  在這里可利用分部類為實體增加Guid屬性,關(guān)于分部類于分部方法的詳細介紹可參考C#綜合揭秘——分部類和分部方法

namespace Business.DomainModel
{
public interface Root {
}

public partial class Order:Root
{
private Guid _guid;

public Order()
{
_guid = System.Guid.NewGuid();
}

//為根對象設(shè)置唯一的Guid;
public Guid GUID
{
get { return _guid; }
}
}

public partial class Person:Root
{
public Person()
{
_guid = System.Guid.NewGuid();
}

//為根對象設(shè)置唯一的Guid;
private Guid _guid;

public Guid GUID
{
get { return _guid; }
}
}
}

it知識庫結(jié)合領(lǐng)域驅(qū)動設(shè)計的SOA分布式軟件架構(gòu),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 色多多www视频在线观看免费 | 亚洲产国偷v产偷v自拍涩爱 | 亚洲国产精品久久久久网站 | 亚洲人成图片欧美人成图片 | 欧美三级免费看 | 乱色欧美videos黑人 | 国产呦精品一区二区三区网站 | 色视频在线免费看 | 影音先锋国产资源 | 国产成人午夜片在线观看 | 亚洲精品美女久久久久网站 | 国产在线精品一区二区三区 | 色哟哟精品| 精品一区二区三区在线观看l | 伊人网在线免费观看 | 国产国产成人久久精品杨幂 | 久草中文在线视频 | 天天网综合 | 免费在线观看黄网站 | 色综色天天综合网 | 一区二区三区中文国产亚洲 | 久久只这里是精品66 | 中文字幕第一页亚洲 | 美国一级毛片aa黑寡妇 | 麻豆亚洲| 国产成人精品s8p视频 | 日本一区二区在线不卡 | 二区在线播放 | 国产成人 免费观看 | 精品国产第一页 | 一级做a爰片性色毛片新版的 | 亚洲成人免费网站 | 亚洲成人国产精品 | 综合成人 | 中文字幕精品一区二区三区在线 | 久久99国产精品久久99软件 | 一区二区三区四区在线不卡高清 | 九九99re在线视频精品免费 | 在线精品免费视频 | 一本大道加勒比久久 | 91国自产精品中文字幕亚洲 |