2011-10-26 90 views
3

我有我的實體,如我的領域模型中定義的Customer,Order等。數據庫特定的類型是在域模型還是數據訪問層?

現在我想定義一個名爲IRepository的接口來表示我的持久層,我將進一步擁有實現IRepository的SQLRepository,CacheRepository。

現在我想知道是否應該在域模型或數據訪問層中定義IRepository?我猜SQLRepository和CacheRepository需要進入DAL,但IRepository是否也在那裏?

此外,例如我的知識庫從客戶表中返回一個客戶列表,我對如何設計這個有點困惑,似乎最終我在DAL和域模型中重複類型。見下面的例子:

在應用我想要做這樣的事情:

var repository = new SQLRepository(); 

//Below repository.customers represents customer table 
List<Customer> customers = repository.Customers.list(); 

所以在我的域名:

class Customer 
{ 
    public int id; 
    public string name; 
} 

在我的DAL:

class SqlRepository:IRepository 
{ 
    public CustomerTable Customers; 
} 

class CustomerTable 
{ 
    public List<Customer> list(); 
} 

我想知道是否有更好的方法來設計這些圖層?

* UPDATE

我已經有DAL和在不同的類庫/組件中定義的域。起初我以爲我會有像客戶這樣的POCO實體,它代表數據庫表中的一條記錄,但是在哪裏聲明Customer.Add(客戶)?它是否進入DAL?我不想在DAL中使用業務規則,如果我開始在實體中添加方法,他們會變得複雜,具有持久性邏輯以及其中的業務邏輯。

回答

0

以下信息對另一個問題它顯示了一個簡單的項目結構:Placing Model in separate assembly

我的看法是,IRepository界面應該在你的數據層項目公開。這些實現可以是私有的(使用Factory或Dependency Injection將它們加載到其他項目中),並且您創建的域模型可以由業務層和數據層共享。

+0

我的想法也是 - 如果可能的話,將它們自己的組件中的圖層分開。 – mozillanerd

+0

是的,我會分層到不同的組件。這也將使您有機會將圖層分佈在物理層上。 –

+0

我已經有DAL和在不同的類庫/組件中定義的域。起初我以爲我會有POCO實體,如客戶代表在數據庫表中的一個記錄,但隨後在哪裏申報Customer.Add(客戶)?它是否進入DAL?我不想在DAL中使用業務規則,如果我開始在實體中添加方法,他們會變得複雜,具有持久性邏輯以及其中的業務邏輯。 – newbie

0

一種選擇是將您的類型放入由業務層和數據層引用的單獨的公共或類型彙編中。小心限制進入該組件的內容,以免引入不必要的耦合。

它以把常數在由SQL層共享的公共組件的類似的方法(預處理),商業邏輯層和對象模型...

相關問題