簡體   English   中英

特定於數據庫的類型是否屬於域模型或數據訪問層?

[英]Do the database specific Types go in Domain Model or Data Access Layer?

我有我的域模型中定義的客戶,訂單等實體。

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

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

此外,例如我的Repository從Customer表返回一個Customers列表,我對如何設計它有點困惑,似乎我最終在DAL和Domain Model中重復了類型。 見下面的例子:

在應用程序中我想做這樣的事情:

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();
}

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

*更新

我已經在不同的類庫/程序集中定義了DAL和Domain。 最初我以為我會像Customer這樣的POCO實體代表數據庫表中的一條記錄,但是然后在哪里聲明Customer.Add(客戶)? 它會進入DAL嗎? 我不想在DAL中使用業務規則,如果我開始在我的實體中添加方法,它們就變得復雜,具有持久性邏輯以及其中的業務邏輯。

一種選擇是將您的類型放入由業務層和數據層引用的單獨的公共或類型程序集中。 小心限制組件中的內容,這樣就不會引入不必要的耦合。

將常量放入由sql層(預處理),業務邏輯層和對象模型共享的公共程序集中的方法類似...

以下信息針對另一個問題,它顯示了一個簡單的項目結構: 將模型放置在單獨的程序集中

我的觀點是,在您的DataLayer項目中,IRepository接口應該是公共的。 實現可以是私有的(使用工廠或依賴注入將其加載到其他項目中),您創建的域模型可以由業務層和數據層共享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM