2012-02-20 83 views
3

如果你有一個商業規則,用戶(或用戶界面)永遠不會看到表中的前30項,你應該把這個過濾器放在Repository的GetAll()中?意思是,存儲庫是否會處理數據過濾,將數據模型化,以便像ViewModel或Controller那樣交回給調用者?我聽說模型應該很厚,而控制器/虛擬現實應該很輕。存儲庫/模型中的商業邏輯好嗎?

我遇到的問題是另一位與我共享項目的開發人員將他的所有存儲庫(每個表一個)全部使用相同的實現,只是將LinqToSql類型的屬性複製到域類型。除了通過Func提供的更新和刪除或獲取數據之外,存儲庫本身沒有任何邏輯。

我在另一方面創建的倉庫(即在T的IRepository繼承)的每個表,並把特定的邏輯在一些(不是全部),其中我感覺需要邏輯交還域對象。

所以在我的情況下,業務邏輯可以在存儲庫中完成,在他的情況下,它必須由用戶完成,該用戶可以是服務或直接使用ViewModel。哪一個更受歡迎?

回答

6

如果你有一個業務規則,表中的前30項永遠不會被用戶(或UI)看到,你應該把這個過濾器放在Repository的GetAll()中?

首先這聽起來不像業務規則。業務規則使用ubiquitous language表示,除非您正在使用數據庫引擎,否則此語言沒有像'table'這樣的詞。

回答你的主要問題,過濾邏輯絕對可以存放在倉庫中。這是repository用於:封裝存儲,檢索和搜索。關於知識庫的最重要的事情之一是它的接口屬於域層,但它的實現屬於數據訪問層。所以你的情況的代碼是這樣的:

域:

// repository interface: 
public interface Orders{ 
    IList<Order> GetDelinquent(); 
} 

數據訪問:

public SqlOrders : Orders{ 
    IList<Order> GetDelinquent(){ 
     // do whatever needs to be done to find 
     // delinquent orders in sql database. 
     // filter first 30 records for example 
    } 
} 

注意,倉庫界面帶來域成焦點(我們不說'所有除前30條記錄外',我們說'延誤')。

我遇到的問題是另一個開發商是誰與我分享一個項目的所有他的倉庫(每桌一個)簡單地都使用相同的實現,一個LinqToSql類型的簡單的拷貝屬性域類型。除了通過Func提供的更新和刪除或獲取數據之外,存儲庫本身沒有任何邏輯。

另一方面,我爲每個表創建一個存儲庫(從T的IRepository繼承而來),並將某些(並非全部)特定邏輯放在需要邏輯來交回域對象的地方。

通用存儲庫接口通常是一個壞主意,它太數據中心,太CRUDy,請參閱this answer的細節和鏈接。

所以在我的情況下,業務邏輯可以在存儲庫中完成,在他的情況下,它必須由用戶完成,該用戶可以是服務或直接使用ViewModel。哪一個更受歡迎?

業務邏輯和數據訪問邏輯之間有很大的區別。您希望避免將業務邏輯放入存儲庫實現中。這個邏輯屬於域對象。

+0

感謝您的詳細解答,我意識到我不是在討論業務邏輯,而是數據訪問規則和邏輯。 – 2012-02-21 03:42:45