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

我對(duì)NHibernate的感受(1):對(duì)延遲加載方式的誤解

  NHibernate是.NET平臺(tái)上最著名的ORM框架,雖說(shuō)出身于Java平臺(tái)上的Hibernate,但是從外部看來(lái)這幾乎就是一個(gè).NET平臺(tái)上的原生產(chǎn)品:有自己的社區(qū),有自己的用戶,有自己的商業(yè)支持,有利用C#特性的獨(dú)立擴(kuò)展。它不像Lucene.NET那樣,一眼就能看出濃重的Java氣息,Java的命名方式等等。我用NHibernate時(shí)間不長(zhǎng),而NHibernate的復(fù)雜程度也決定了我無(wú)法像了解LINQ to SQL那樣容易。不過(guò)在使用了一段時(shí)間過(guò)后,還是對(duì)它有一定體會(huì)。有欣喜,有誤解,也有抱怨。

  這幾篇文章里我不打算多談NHiberante的優(yōu)點(diǎn),因?yàn)樗膬?yōu)勢(shì)實(shí)在過(guò)于明顯。如果不考慮Telerik ORM這樣的商業(yè)框架(因?yàn)槲覜](méi)用過(guò),完全不了解),.NET平臺(tái)上開源和免費(fèi)的ORM工具幾乎沒(méi)有NHibernate的對(duì)手:LINQ to SQL使用的確容易,上手非常快,某些功能也非常細(xì)致(稍后會(huì)談到),但對(duì)于ORM工具的靈魂“Mapping能力”實(shí)在是不敢恭維。前一段時(shí)間我也簡(jiǎn)單了解了一下微軟新出的Entity Framework,雖然也秉承了微軟一貫的易用性(如強(qiáng)大的LINQ支持),在Mapping能力上也有切實(shí)的提高,但是在功能和一些細(xì)節(jié)控制上還遠(yuǎn)不如NHibernate。畢竟NHibernate是經(jīng)歷了多年發(fā)展,對(duì)于各種情況幾乎都有應(yīng)對(duì)措施。如延遲與否,是使用select還是join獲取數(shù)據(jù),是否在集合加載時(shí)附加條件。此外,NHibernate的Interceptor能力所帶來(lái)的擴(kuò)展性也是讓我比較滿意的,不過(guò)這點(diǎn)有機(jī)會(huì)再詳細(xì)談一下。

  總之,目前NHibernate是我最滿意的ORM框架。

  那么現(xiàn)在進(jìn)入正文內(nèi)容。首先我想談一下自己對(duì)NHibernate實(shí)現(xiàn)方式上的一個(gè)誤解,這個(gè)誤解讓我對(duì)NHibernate一直有著錯(cuò)誤的抱怨,我還在幾篇文章里不斷重復(fù)對(duì)NHibernate的錯(cuò)誤職責(zé),目前已經(jīng)糾正,希望不會(huì)造成太大問(wèn)題。

  這個(gè)誤解,是我一直認(rèn)為NHibernate使用了一種簡(jiǎn)單的延遲加載方式。例如有這樣一個(gè)對(duì)象:

public class Article{    public virtual int ArticleID { get; set; }    public virtual string TagNames { get; set; }}

  在延遲加載的時(shí)候,我一直以為NHibernate只是通過(guò)Emit生成一個(gè)Article的子類,然后把屬性覆蓋成簡(jiǎn)單讀寫,例如:

public class Article$LazyProxy : Article{    private string m_tagNames;    public override string TagNames    {        get        {            return this.m_tagNames;        }        set        {            this.m_tagNames = value;        }    }}

  這么做的問(wèn)題自然是讓TagNames屬性原本的邏輯丟失了。如果對(duì)于失血的DTO模型,這自然沒(méi)有關(guān)系,因?yàn)檫@些屬性本身內(nèi)部沒(méi)有邏輯。但是,我習(xí)慣使用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)的方式來(lái)為產(chǎn)品建模,因此在這些屬性中很可能擁有一些業(yè)務(wù)邏輯。例如改變對(duì)象的其他一些狀態(tài),同步至其他字段,或是觸發(fā)事件等等。因此,丟失屬性邏輯對(duì)我的影響是致命的,這意味著我必須“照顧”NHibernate的特性進(jìn)行編程,而在進(jìn)行建模時(shí)就開始考慮持久化邏輯是DDD實(shí)踐中的一大問(wèn)題——雖然軟件開發(fā)不是理想化的,權(quán)衡是正常的,但如果NHiberante只能應(yīng)付失血的DTO模型,那么它就對(duì)不起它的業(yè)界盛名了。

  可惜的是,NHibernate沒(méi)有在這里翻船——所以可能更應(yīng)該說(shuō)“值得慶幸”——它使用了一種維持原有業(yè)務(wù)邏輯的延遲代理寫法:

public class ArticleLazyProxy : Article{    public override string TagNames    {        get        {            var tagNames = ... // 加載數(shù)據(jù)            base.TagNames = tagNames;            return base.TagNames;        }        set        {            base.TagNames = value;        }    }}

  當(dāng)然,這是我從“測(cè)試效果”中反推出來(lái)的情況,NHiberante的實(shí)際做法應(yīng)該不會(huì)那么簡(jiǎn)單。如果您關(guān)注我的文章,會(huì)發(fā)現(xiàn)這就是我之前提出的最為理想的延遲代理實(shí)現(xiàn)方式,也是我在Eazy類庫(kù)中使用的做法。我在實(shí)現(xiàn)了Eazy的基本功能之后,還因?yàn)樗鼭M足了我的要求而微微沾沾自喜了一把,誰(shuí)知這一切早已被NHibernate拿下。我昨天晚上試驗(yàn)出這個(gè)結(jié)果之后也震驚了一把,不是因?yàn)镹Hibernate的強(qiáng)大(因?yàn)樗静辉摲复说图?jí)錯(cuò)誤),而是因?yàn)槲也焕斫庾约褐盀槭裁磿?huì)輕易地臆斷NHibernate的做法?想象我還在多篇文章中抱怨過(guò)這點(diǎn),昨天試驗(yàn)過(guò)后,我立即把自己能想到的無(wú)稽之談都修改了。慚愧啊。

NET技術(shù)我對(duì)NHibernate的感受(1):對(duì)延遲加載方式的誤解,轉(zhuǎn)載需保留來(lái)源!

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

主站蜘蛛池模板: 祺鑫WRITEAS流出来了 | 无码AV熟妇素人内射V在线 | 欧美日韩精品久久久免费观看 | 国产精品成人无码免费视频 | 十分钟免费视频大全在线 | 先锋影音av资源站av | 好看的电影网站亚洲一区 | 亚洲精品成人久久久影院 | 色欲天天天综合网免费 | 大香网伊人久久综合网2020 | 久久99热成人精品国产 | 欧美另类老少配hd | 热久久2018亚洲欧美 | 成人毛片免费在线观看 | 成人动漫bt种子 | 在线观看精品视频看看播放 | 女仆翻身大作战 | 亚洲bt区| 欧美日韩中文国产一区 | 亚洲H成年动漫在线观看不卡 | 国内精品久久人妻无码HD浪潮 | 暖暖 免费 高清 日本 在线 | 国产午夜精品一区二区三区 | 美女不要啊| 国产盗摄一区二区三区 | 果冻传媒在线播放 免费观看 | 青草久久伊人 | 黄色三级三级三级免费看 | 日本久久精品毛片一区随边看 | 一二三四在线视频社区 | 91嫩草国产在线观看免费 | 大伊人青草狠狠久久 | 全彩无翼污之邪恶女教师 | 99热久久视频只有精品6 | 国产久青青青青在线观看 | 男人J放进女人P全黄网站 | 国产69精品久久久久麻豆 | 国产精品亚洲二线在线播放 | 日日噜噜夜夜狠狠视频 | 亚洲妈妈精品一区二区三区 | 拔擦拔擦8X永久华人免费播放器 |