天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

總結(jié)一下領(lǐng)域模型的驗(yàn)證(附代碼下載)

  一:什么是領(lǐng)域模型(Domain Model)

         1,Entities

         2,Value Objects

         3,Relations

  二:只談驗(yàn)證(Validation)——三種常見(jiàn)的做法

         1,Constructor/Method based Validation

         2,Validate() Method

         3,Validation Services

         4,Validation Configuration

  一:什么是領(lǐng)域模型(Domain Model)

  我們可以在概念層次認(rèn)為Domain Model就是在大的領(lǐng)域邊界中的,可以用基于離散的思想來(lái)限定出的,承載“數(shù)據(jù)”和“關(guān)系”的小邊界(個(gè)人給的定義,僅供參考)。定義中蘊(yùn)含著這樣一層意思:所謂模型乃是我們限定出的用于解決問(wèn)題的承載著“數(shù)據(jù)”與“關(guān)系”的“問(wèn)題邊界”,也就是Model不一定跟現(xiàn)實(shí)中的真實(shí)物理對(duì)象一一對(duì)應(yīng),雖然大都一一對(duì)應(yīng)。領(lǐng)域大邊界由Model小邊界來(lái)明確,Model小邊界需要由領(lǐng)域大邊界來(lái)給限定出問(wèn)題的范圍(因?yàn)橛钪媸菬o(wú)窮的開(kāi)放的,除了那個(gè)終極規(guī)律外的任何規(guī)律都是有適用范圍的,不限定出范圍就會(huì)寸步難行,無(wú)法認(rèn)識(shí)任何問(wèn)題了)。

  領(lǐng)域模型承載的數(shù)據(jù)可以分為兩個(gè)類(lèi)別:Entities和Value Objects。Model中的數(shù)據(jù)依照一定“規(guī)則”模擬出一個(gè)有機(jī)的問(wèn)題模型,這個(gè)“規(guī)則”約等于Relations。

  1, Entity是這樣的數(shù)據(jù),在它的生命周期中需要一個(gè)標(biāo)識(shí)(Identity)。在Domain Model中(注意這里的Model是在一個(gè)限定的領(lǐng)域中的)如果某條數(shù)據(jù)脫離了這個(gè)標(biāo)識(shí)就沒(méi)有了意義的話(huà),那么這樣的數(shù)據(jù)就是該Domain Model的Entities類(lèi)別的數(shù)據(jù)了。比如在cnblogs的系統(tǒng)中,每一個(gè)BlogSite都有一個(gè)BlogTitle,但是這個(gè)BlogTitle是可以修改的,當(dāng)我修改了我的BlogSite的BlogTile后我卻依然能夠通過(guò)“www.cnblogs.com/xuefly”訪(fǎng)問(wèn)到,這里可以說(shuō)“www.cnblogs.com/xuefly”就是我的blog的標(biāo)識(shí)了。如果沒(méi)有這個(gè)標(biāo)識(shí)存在的話(huà),那么BlogTitle在空間中的存在也就沒(méi)有了意義(當(dāng)BlogTitle與BlogSite脫離后BlogTitle就變成了“字符串”,而在Blog領(lǐng)域中“字符串”是沒(méi)有意義的)。像BlogTitle這樣的數(shù)據(jù)就是屬于BlogSite模型的的Entitys類(lèi)別的數(shù)據(jù),我們把這樣的數(shù)據(jù)交給BlogSite來(lái)驗(yàn)證的話(huà)是合理的。比如當(dāng)我們修改自己的BlogSite的BlogTile中包含敏感的非法字符時(shí)或者長(zhǎng)度超過(guò)了一定限度時(shí),修改就不會(huì)保存成功,這里的驗(yàn)證就該是由BlogSite本身來(lái)完成的。

  2, Value Objects是這樣的數(shù)據(jù):它的存在不需要標(biāo)識(shí)。存在就是要有意義,還是在cnblogs的系統(tǒng)中,每個(gè)BlogSite都會(huì)有博主(BlogOwner),因?yàn)槲覀兊腂logSite是單用戶(hù)的所以在BlogSite中應(yīng)該會(huì)有一個(gè)BlogUser:Person類(lèi)型的屬性,我們假設(shè)這個(gè)屬性被命名為BlogOwner。

  BlogOwner是一個(gè)BlogUser類(lèi)型的對(duì)象,BlogUser類(lèi)型對(duì)象的存在不依賴(lài)于BlogSite的存在,也就是即使沒(méi)有BlogSite的話(huà)這個(gè)被指向了BlogSite.BlogOwner的BlogUser類(lèi)型的對(duì)象依然有存在的意義(是否可以這樣理解,BlogUser是一個(gè)Person,而Person在Blog領(lǐng)域中是具有意義的)。這里的BlogOwner就可以歸為BlogSite的Value Object類(lèi)別的數(shù)據(jù)了。我們看到BlogSite有一個(gè)ID標(biāo)識(shí),這個(gè)ID標(biāo)識(shí)是提供給BlogTitle這樣的BlogSite的Entitys類(lèi)別的數(shù)據(jù)的,并不是提供給BlogOwner的。再進(jìn)一步說(shuō)明就是:在一個(gè)BlogSite類(lèi)型的對(duì)象blogSite1中,blogSite1的BlogOwner屬性值原來(lái)指向user1,而現(xiàn)在我們把blogSite1.BlogOwner指向null,這時(shí)user1失去了與blogSite1的聯(lián)系,然而user1卻在整個(gè)Blog領(lǐng)域中依舊具有實(shí)際的意義,因?yàn)樵贐log領(lǐng)域中必須有用戶(hù)這個(gè)概念(BlogUser Class),user1是一個(gè)用戶(hù),user1在blog領(lǐng)域中依舊有意義。而B(niǎo)logTitle就不同了(blogSite1.BlogTitle = blogTitle1),如果我們把blogSite1.BlogTitle指向null的話(huà),BlogTitle1同樣與blogSite1脫離了關(guān)系,這個(gè)時(shí)候blogTitle1由“博客標(biāo)題”變成了“字符串”,blogTitle1是個(gè)字符串,它在Blog領(lǐng)域中沒(méi)有意義。BlogOwner屬于BlogSite的Value Objects類(lèi)別的數(shù)據(jù),BlogOwner的數(shù)據(jù)應(yīng)交由BlogUser模型來(lái)驗(yàn)證,不應(yīng)由BlogSite模型來(lái)驗(yàn)證。與BlogSite一樣BlogUser.Name,BlogUser.LoginID,BlogUser.Password屬于BlogUser模型的Entitys類(lèi)別的數(shù)據(jù)。

  3,關(guān)系(Relations)

  ……

  二,只談驗(yàn)證(Domain Model Validation)

  業(yè)務(wù)規(guī)則要求我們的Domain Model必須滿(mǎn)足某些約束,比如BlogSite的BlogTitle的長(zhǎng)度不能大于等于255個(gè)字符等,這就是業(yè)務(wù)規(guī)則。如果說(shuō)對(duì)BlogTitle的長(zhǎng)度進(jìn)行約束貌似還有點(diǎn)不怎么說(shuō)的通的話(huà),那么在Blog領(lǐng)域中業(yè)務(wù)規(guī)則要求BlogUser類(lèi)型的對(duì)象的Age屬性不能小于等于零就是無(wú)可厚非的了。正是這些被約束的數(shù)據(jù)組成了Domain Model,通過(guò)這些約束,低級(jí)的數(shù)據(jù)(基本數(shù)據(jù)類(lèi)型)被我們組織成了更高一級(jí)的復(fù)雜類(lèi)型的數(shù)據(jù)——Domain Model Class,然后領(lǐng)域中的所有Domain Model交織起來(lái)最終又詮釋了整個(gè)領(lǐng)域。我們認(rèn)為:沒(méi)有邊界的宇宙中的每一個(gè)概念都是被約束出來(lái)的,無(wú)論是“領(lǐng)域”還是領(lǐng)域中的“模型”,終極都是由規(guī)則約束出來(lái)的具有邊界的問(wèn)題模型。如果沒(méi)有了約束就沒(méi)有了Model沒(méi)有了Domain,一切可以認(rèn)識(shí)的東西都沒(méi)有了,只剩下了一個(gè)開(kāi)放的沒(méi)有邊界的宇宙了。可見(jiàn)“規(guī)則”(Rule)是多么的重要,而執(zhí)行規(guī)則就需要“驗(yàn)證”(Validation)。

  1, 基于構(gòu)造的驗(yàn)證

  將驗(yàn)證放在構(gòu)造對(duì)象的時(shí)候,比如構(gòu)造函數(shù)中或者放在屬性中。在這種情況下,當(dāng)驗(yàn)證失敗的時(shí)候我們一般直接拋出異常,比如拋出自定義的ValidationException異常,將錯(cuò)誤信息放在自定義異常中。

public class Person : Entity
{
private string _name;
private DateTime _birthday;

public string Name
{
get
{
return _name;
}
set
{
if (value.IsNullOrEmpty())
{
throw new IsNullOrEmptyException("名稱(chēng)不能為空");
}
_name
= value;
}
}

public DateTime Birthday
{
get
{
return _birthday;
}
set
{
if (value >= DateTime.Now || DateTime.Now.AddYears(-120) > value)
{
throw new ValidationException("出生日期不在有效的范圍內(nèi)");
}
_birthday
= value;
}
}
}

it知識(shí)庫(kù)總結(jié)一下領(lǐng)域模型的驗(yàn)證(附代碼下載),轉(zhuǎn)載需保留來(lái)源!

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

主站蜘蛛池模板: 亚洲zooz人禽交xxxx | 欧美性猛交XXXX乱大交极品 | 多男同时插一个女人8p | 国产露脸无码A区久久蘑菇 国产露脸无码A区久久 | 撕开美女的衣服2 | 天天啪免费视频在线看 | 99热久久这里只有精品视频 | 国产 高清 无码 中文 | 亚洲国产精品一区二区久久第 | 男人插曲视频大全免费网站 | 狠狠色欧美亚洲狠狠色www | 中文字幕AV在线一二三区 | 午夜国产精品视频 | 成年人视频免费在线播放 | 色偷拍自怕亚洲在线 | 色欲AV亚洲永久无码精品麻豆 | 97视频国产 | 校花在公车上被内射好舒 | 国产中文欧美日韩在线 | 国产精自产拍久久久久久蜜 | 草草久久久亚洲AV成人片 | 欧美日韩中文字幕综合图区 | 免费观看成人www精品视频在线 | 国内精品日本久久久久影院 | 无码中文字幕热热久久 | 俄罗斯女人Z0Z0极品 | 男女全黄h全肉细节文 | 午夜神器18以下不能进免费 | 国产成人精品永久免费视频 | 欧美激情精品久久久久久不卡 | 韩国无遮羞禁动漫在线观看96 | 免费一级片网站 | 国产人妻久久久精品麻豆 | 久久视频这里只精品99热在线 | 超碰最新地址 | 久久中文字幕人妻熟AV女蜜柚M | 免费无码一区二区三区蜜桃大 | 麻豆XXXX乱女少妇精品-百度 | 精品少妇高潮蜜臀涩涩AV | 亚洲AV永久无码精品澳门 | 欧美日韩一区在线观看 |