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

使用LINQ Expression構建Query Object

  這個問題來源于Apworks應用開發(fā)框架的設計。由于命令與查詢職責的分離,使得基于CQRS體系結構風格的應用系統(tǒng)的外部存儲系統(tǒng)的結構變得簡單起來:在“命令”部分,簡單地說,只需要 Event Store和Snapshot Store來保存Domain Model;而“查詢”部分,則又是基于事件派送與偵聽的系統(tǒng)集成。之前我也提到過,“查詢”部分由于不牽涉到Domain Model,于是,它的設計應該隨意性很大:不需要受到Domain Model的牽制,例如,我們可以根據(jù)UI所需的數(shù)據(jù)源結構進行“查詢”庫的設計。Greg Young在他的“CQRS Documents”一文中也提到了這樣一些相關話題:就“查詢”部分而言,雖然也存在“阻抗失衡”效應,但是事件模型與關系模型之間的這種效應,要遠遠小于對象模型與關系模型之間的“阻抗失衡”效應。這是因為,事件模型本身沒有結構,它僅僅表述“該對關系模型做哪些操作”這樣的概念。在設計上,Greg Young建議,采用一種非正規(guī)的方式設計“查詢”數(shù)據(jù)庫,以便盡量減少讀取數(shù)據(jù)時所需的JOIN操作,比如可以選用基于第一范式(1NF)的關系模型。這是一種反范式模型,雖然Greg Young并沒有建議根據(jù)UI所需的數(shù)據(jù)源結構進行設計,但思想是相同的:基于事件而不拘泥于對象模型本身。由此引申出來的另一個好處就是外部存儲系統(tǒng)架構的隨意性:你可以選用任何存儲技術和存儲媒介,這又給基于系統(tǒng)架構的性能優(yōu)化提供了便利。因為并非所有的存儲架構都支持“表”、“字段”、“存儲過程”、“JOIN”這些概念。
  根據(jù)上面的簡單分析,我們得到一個結論:通常情況下,或許基于CQRS體系結構風格的應用系統(tǒng)更多的是采用的“平整”的外部存儲結構,簡而言之,就是一個數(shù)據(jù)訪問對象(DAO)對應一張數(shù)據(jù)表。這也是我所設計的Apworks應用開發(fā)框架中默認支持的一種存儲結構。有讀過Apworks源代碼的朋友會發(fā)現(xiàn),在Apworks.Events.Storage命名空間下,有兩個定制的DAO:DomainEventDataObject,用于表述領域事件的數(shù)據(jù)結構,以及SnapshotDataObject,用于表述快照的數(shù)據(jù)結構,與之相對應的就是數(shù)據(jù)庫中的兩張表:DomainEvents和 Snapshots。雖然結構變得這么簡單,但是映射關系總還是需要維護的:最簡單的就是需要在對象類型名稱與數(shù)據(jù)表名之間,以及對象屬性與數(shù)據(jù)表字段之間建立起映射關系。在Apworks中,這種映射關系是由Apworks.Storage.IStorageMappingResolver接口完成的。有關這個接口的內(nèi)容不是本文討論的重點,暫且不深入分析了。
  至此,也許你不會接受我上面的討論,認為“基于UI設計數(shù)據(jù)庫結構”或者“采用1NF、反范式設計數(shù)據(jù)庫結構”是無法接受的,那么,接下來的討論可能對你來說意義也不大了。因為下面的問題是以上面的描述為基礎的:一個數(shù)據(jù)訪問對象對應一張數(shù)據(jù)表。不過即使你不認同我的觀點,我也建議你繼續(xù)看完本文。
  Query Object模式

  雖然只是簡單的映射,但畢竟不能忽略這樣的映射關系。Apworks作為一個應用開發(fā)框架,需要提供方便的整合接口,以便今后能夠根據(jù)不同的客戶需求進行擴展。例如在存儲部分,數(shù)據(jù)的增刪改查(CRUD)是基于數(shù)據(jù)訪問對象(DAO)的,這樣做的一個好處是能夠對外部存儲系統(tǒng)進行抽象,使得訪問存儲系統(tǒng)的部分能夠無需關系存儲系統(tǒng)的細節(jié)問題。客戶有可能選擇SQL Server、Oracle、MySQL等關系型數(shù)據(jù)庫作為存儲系統(tǒng),也可以選擇其它的非關系型數(shù)據(jù)庫作為存儲系統(tǒng),因此,我們的設計不能僅僅局限于關系型數(shù)據(jù)庫,我們需要同時考慮其它形式的數(shù)據(jù)存儲產(chǎn)品以便將來能夠方便地集成新的存儲方案。假設我們要設計一個針對 DomainEventDataObject的“查詢”功能,我們需要考慮的問題可能會有(但不一定僅限于):
  * 需要查詢對象的哪些屬性(或者說與DomainEventDataObject相對應的數(shù)據(jù)表的哪些字段)
  * 需要根據(jù)什么樣的條件進行查詢
  * 查詢是否需要排序
  * 是否只查結果集中的任意一條記錄,還是要返回所有的記錄
  在Apworks框架的Alpha版本中,查詢的方法定義在Apworks.Storage.IStorage接口中。比如,根據(jù)給定的查詢條件和排序方式,對指定DAO進行查詢的方法定義如下:

/// <summary>
/// Gets a list of ordered objects from storage by given selection criteria and order.
/// </summary>
/// <typeparam name="T">The type of the object to get.</typeparam>
/// <param name="criteria">The <c>PropertyBag</c> instance which contains the criteria.</param>
/// <param name="orders">The <c>PropertyBag</c> instance which contains the ordering fields.</param>
/// <param name="sortOrder">The sort order.</param>
/// <returns>A list of ordered objects.</returns>
IEnumerable<T> Select<T>(PropertyBag criteria, PropertyBag orders, SortOrder sortOrder)
where T : class, new();

NET技術使用LINQ Expression構建Query Object,轉載需保留來源!

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

主站蜘蛛池模板: 99九九精品国产高清自在线 | 国产亚洲精品久久精品69 | 欧美精品专区第1页 | 午夜天堂一区人妻 | 2021久久99国产熟女人妻 | 4388成人 | 儿媳妇完整版视频播放免费观看 | 欧美亚洲日韩国码在线观看 | 伊人久久青青 | 亚洲精品拍拍央视网出文 | 久久亚洲伊人中字综合精品 | 97人人碰免费视频公开 | 在教室轮流被澡高H林萌 | 九九热这里只有精品2 | 国产精品18久久久久久白浆. | 四虎国产精品永久一区高清 | 久久热在线视频精品 | 男人边吃奶边挵进去呻吟漫画 | 扒开屁股眼往里面夹东西 | 色欲狠狠躁天天躁无码中文字幕 | 99热在线播放 | 好男人免费观看在线高清WWW | 色欲狠狠躁天天躁无码中文字幕 | 啪啪漫画无遮挡全彩h网站 啪啪漫画无遮挡全彩h同人 | 人妻美妇疯狂迎合 | 亚洲精品欧美精品中文字幕 | 吉吉av电影 | 祺鑫WRITEAS流出来了 | 国产精品九九久久 | 男女车车的车车网站W98免费 | 中文字幕视频免费在线观看 | 好男人在线观看免费视频WWW | 伊人久久综在合线影院 | 动漫美女的禁 | 亚洲精品成人a | 国产精品玖玖玖影院 | 耻辱诊察室1一4集动漫在线观看 | 老司机深夜福利ae 入口网站 | 久久强奷乱码老熟女 | 国产午夜精品AV一区二区麻豆 | 精品一区二区三区免费毛片 |