3

我正在用EntityFramework代碼優先和Sql Server Compact版本構建一個小型食譜組織者MVC項目,作爲了解更多關於DDD和存儲庫模式的方法。域驅動設計和聚合

以下是我的一些域實體,我簡化了他們的這個問題。

public class Recipe { 

    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    /// <summary> 
    /// Represents a common meal type of 「Breakfast, Lunch or Dinner」 
    /// or type of course 「Appetisers, Soups, Salads, Fish, Poultry & Game, Meat, Side dishes, Desserts, Miscellaneous", etc. 
    /// (for scope I am not considering brunch or supper or any other type) 
    /// </summary> 
    [Required] 
    public Course Course { get; set; } 


    public virtual ICollection<Ingredient> Ingredients { get; set; } 
} 

public class Ingredient { 
    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 
} 

public class Course { 
    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 
} 

在我這個項目,我會說,配方是聚合根和成分和課程的範圍是意見的食譜聚集。

如果我拿這個例子,並使用MVC scaffolding給我一個存儲庫模式的示例實現,我得到下面的接口和一個EFRecipeRepository類,它實現了接口並具有對EF DB上下文的引用。

public interface IRecipeRepository 
{ 
    IQueryable<Recipe> All { get; } 
    IQueryable<Recipe> AllIncluding(params Expression<Func<Recipe, object>>[] includeProperties); 
    Recipe Find(int id); 
    void InsertOrUpdate(Recipe recipe); 
    void Delete(int id); 
    void Save(); 
} 

根據這一指導:

在存儲庫模式的情況下,總根是唯一 從資源庫對象客戶端的代碼加載。

信息庫封裝訪問到子對象 - 從呼叫者的 角度來看,它會自動加載它們,無論是在同一時間 根加載或當他們真正需要(如延遲加載)。

我希望在此界面添加更多內容,以便通過配方獲得配料或課程。

我遇到的問題是,我想添加一些功能到我的視圖,只涉及成分或課程,例如:導航所有不同類型的課程(不只是與食譜有關)和一個自動完成成分清單。

在我的項目範圍內,配料不存在於配方外,所以它應該是配方的聚合物。然而,課程看起來應該是一個聚集根本身,因爲它本身存在的方式?

我很努力想要看到這一切應該如何工作,如果我想獲得每一種成分的清單,那意味着我首先必須使用食譜知識庫加載所有的食譜,以便找到所有的成分?

課程有一個類似的問題,除了它被用作分類食譜的方式,因此也可以存在於該邊界之外。

是否有一些我失蹤的概念?也許是一種創建用於這種表示層需求的服務的方法?有沒有人對這應該如何完成有任何意見?還是有更好的建議?由於

在一個側面說明,這是一個小項目,DDD可能不是最好的辦法,但我覺得在我的領域模型庫模式的持久性無知是非常有用的。

感謝

回答

2

我掙扎着爬的這一切是如何應該工作,如果我想獲得每一個成分的列表,將意味着我首先要使用的配方庫加載願景所有的食譜,以找到所有的成分?

如果你需要的是一個自動完成的成分不同名稱列表,我確實只是提供一個從數據庫中提取必要報告的服務。報告在聚合中捅了捅,我感覺非常好,因爲他們就是這樣 - 報告。你不應該讓服務從一個聚合內返回可用實體(即不返回Ingredient []),因爲這會打開調用者的聚合邊界。只需返回一個字符串[]或類似的。

再說,我會考慮這兩個課程,並在所有,但最瑣碎的應用的成分總根源。成分是否存在沒有食譜?絕對! 「糖」#1(屬於配方#1)與「糖」#2(屬於配方#2)有些不同嗎?我不這麼認爲。有糖。有食譜使用糖。使成分聚集起來很有意義。例如,您可以通過配料輕鬆瀏覽您的食譜。

也是一樣的課程,這是一個概念,那絕對會讓自身的意義。

一個很好的例子爲一個概念,不應該是一個聚合根是一個訂單(即,上面寫着「3個Foobar的電視爲700 $一塊」的東西)。沒有訂單,訂單行就沒有意義。但即使在這種情況下,生成訂單行報告的服務也是合理的(理論上),並且是合法的IMO。例如,人們可能想知道有多少Foobar的電視通常都買在一起,以引入新的偉大Foobar的電視3包(是的,無論...)。這也意味着要在數據庫中搜索通常無法直接訪問的數據。

+0

感謝您的回覆,成分是他們自己的實體,所以當然......有時候一種成分應該獨立存在,在這個項目的範圍內,他們不需要存在配方。但是現在加入了新的成分配方時使用這個自動完成列表..這似乎是這樣,它纔有意義,使其成爲一個聚合根,似乎有點傻有這樣的小區域模型和一半擁有自己的倉庫,雖然實體:P – Pricey 2012-02-24 21:58:52

+0

正如我說:如果你只需要訪問成分的名稱爲自動完成,只需要使用執行正確的查詢服務,讓成分留在配方AR的一部分。如果您的域名不需要配料成爲AR,請不要讓它們成爲AR。它使事情變得簡單。 – 2012-02-24 22:07:15