2012-03-18 76 views
6

我正忙於閱讀和享受.Net中的依賴注入。域邏輯與數據驗證

我很難解釋確切的背景,所以如果你熟悉這本書,請只打擾這個問題。

我的問題與第2章第49頁中的兩個產品類有關。域中有一個,數據訪問層中有一個。據解釋,數據訪問層中的Product類是由Linq to Entity嚮導創建的。

我正在使用Linq to SQL,並且我可以用Ling添加我的模型類到SQL屬性,這樣我就不必再有第二類了。例如。

[Table(Name="Customers")] 
public class Customer 
{ 
    [Column(IsPrimaryKey=true)] 
    public string CustomerID; 
    [Column] 
    public string City; 
} 

但是我覺得這是混合的關注,它會到SQL數據訪問層效果緊密結合我的域名層到Linq的。你同意嗎?

我們假設我爲域和數據訪問層創建了兩個'客戶'類。假設城市是必填字段。保存時,需要檢查此規則。這應該在領域層還是數據訪問層完成?

感謝,Daryn

回答

5

當然,耦合域層的DAL。更糟的是,您的域圖層實體將具有與數據庫中的表相同的結構。如果這些表是關係型的,那麼這將不是域模型的最佳表示。

我們所做的是讓DAL中存在Linq-to-SQL實體,然後我們在DAL中映射類將L2S實體轉換爲域實體,反之亦然。沒關係,因爲DAL真的是你的ORM,而且它的一部分工作就是做這個映射。

我想說,如果城市是必需的,作爲業務規則,那麼這就是業務邏輯,屬於業務邏輯層的業務規則。有驗證包可以幫助解決這個問題。

+0

這兩個答案都非常相似,他們都幫助。這一個是第一個... – Daryn 2012-03-19 22:07:40

+1

@Daryn:如果兩者都有幫助,你應該兩個答案兩個。 – jgauffin 2012-03-20 14:44:12

+0

沒問題,我會投票給你 – Daryn 2012-03-20 19:31:40

6

但是我覺得這是混淆的擔憂,它實際上將我的域層緊密地耦合到Linq到SQL數據訪問層。你同意嗎?

是的,它會。實體框架(代碼優先)和nhibernate都可以使用單獨的映射類,這將使您的模型無需依賴OR/M就可以清理乾淨。

備註:域模型不應該具有屬性的公有setter(在DDD中)。因爲它有效地將模型邏輯移到模型之外。

我們假設我爲域和數據訪問層創建了兩個'Customer'類。假設城市是必填字段。保存時,需要檢查此規則。這應該在領域層還是數據訪問層完成?

數據庫實體應該只存在於存儲庫類中,因此不一定要驗證它。正在保存的域模型應該已經具有正確的狀態。

例子:

public class ArticleRepository 
{ 
    public void Save(Article article) 
    { 
     // Article is already in a correct state 
     // (thanks to no public setters) 

     var dbEntity = new ArticleEntity(); 
     Mapper.Map(article, dbEntity); 
     _dbContext.Save(dbEntity); 
    } 
} 
+0

非常好,非常準確的回覆。 – kamal 2012-03-27 08:27:51