我正在用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可能不是最好的辦法,但我覺得在我的領域模型庫模式的持久性無知是非常有用的。
感謝
感謝您的回覆,成分是他們自己的實體,所以當然......有時候一種成分應該獨立存在,在這個項目的範圍內,他們不需要存在配方。但是現在加入了新的成分配方時使用這個自動完成列表..這似乎是這樣,它纔有意義,使其成爲一個聚合根,似乎有點傻有這樣的小區域模型和一半擁有自己的倉庫,雖然實體:P – Pricey 2012-02-24 21:58:52
正如我說:如果你只需要訪問成分的名稱爲自動完成,只需要使用執行正確的查詢服務,讓成分留在配方AR的一部分。如果您的域名不需要配料成爲AR,請不要讓它們成爲AR。它使事情變得簡單。 – 2012-02-24 22:07:15