在ddd設計中大家都會使用repository pattern來獲取domain model所需要的資料。
1.什麼事repository?
按照最初提出者的介紹,它是銜接資料對映層和域之間的乙個紐帶,作用相當於乙個在記憶體中的域物件集合。客戶端物件把查詢的一些實體進行組合,並把它們提交給repository。物件能夠從repository中移除或者新增,就好比這些物件在乙個collection物件上就行資料操作,同時對映層的**會對應的從資料庫中取出相應的資料。
從概念上講,repository是把乙個資料儲存區的資料給封裝成物件的集合並提供了對這些集合的操作。。。。。。。
在領域驅動設計中,我們有個集合(aggregate)的概念,集合是:
通常我們是對於domain的每個集合會對應的定義乙個repository。也就說,並不是每個實體都會有對應的乙個repository。
repository的介面一般情況下是作為domain model的一部分,但是嚴格意義上講它不屬於domain model。
當我們處理aggregates時,大部分時間我們需要3個常用的相關操作。
1.通過id得到對應的集合·。
2.向repository新增乙個集合。
3.從repository中移除乙個集合。
比如我們有個order表,
那麼它的repository介面irepository(包含三個基本的方法)如下:
假設我們還有另外乙個domain model是product,它的類如下:
它的repository介面iproductrepository如下:
可以看出來我們的兩個介面其實有很多**是重複的,所以可以來個基本的介面irepository,並結合system.collection.generic中的generic屬性來設計irepository的**:
對應的iproductrepository和iorderrepository**也得修改:
為了能夠測試我們的repository,我們這裡建立乙個repository繼承iproductrepository介面:
在建構函式中我們先新增product,然後再實現介面的幾個方法。下面來進行單元測試:
執行後可以通過。。。
在nhibernate中使用repository 模式。
首先我們需要建立乙個session provider,如下:
然後就可以使用單元測試了。
但是實際專案中我們很少使用這種模式。我們來分析下:
當我們有乙個私有的方法是getsession,每次訪問它都會返回乙個session實體, 所以repository中的每個操作都會使用自己的session實體,當我們的專案中不是使用分布式事務時,我們都是希望這些操作都是在乙個事務。
為了解決這個問題我們就可以使用uow模式。
Repository模式介紹彙總
1 linq to sql中repository模式應用場景 2 分享基於entity framework的repository模式設計 總結一下,repository在實際使用中,有下面三種特點 repository的共同性 有一些公共的方法 增刪改查 這些方法無關於repository操作的是哪...
設計模式 21 中介者模式
中介者模式 用乙個中介物件來封裝一系列的物件互動 中介者 就像我們在租房子一樣,有租房子的中介 抽象中介者 mediator package com.actionpattern.intermediary.edition1 抽象中介者 mediator public abstract class me...
設計模式17 中介者模式
中介者模式 mediator pattern 是用來降低多個物件和類之間的通訊複雜性。這種模式提供了乙個中介類,該類通常處理不同類之間的通訊,並支援松耦合,使 易於維護。中介者模式屬於行為型模式。不應當在職責混亂的時候使用。建立中介類 聊天室,負責傳送通訊 include include inclu...