2012-01-09 62 views
1

用下面的域模型: 世界 - >特許經營 - >辦公 - >代理MVC 3我應該如何設計我的存儲庫/ DAL?

據我瞭解,庫應該返回aggrigate根,這些領域的實體是aggrigate根源在哪裏?或所有(我需要每個存儲庫)?

我希望能夠通過由URL傳遞的ID獲取實體。我在哪裏放這些GetById方法?

如果我想獲得特許經營店內部分名字爲「Jo」的所有代理商的清單,我該如何將其構建到系統中?我應該: 在特許經營實體中有一個基本上是.SelectMany linq聲明的方法嗎? 或具有GetByPartialFirstName()方法的代理的存儲庫?

回答

2

視域的邏輯,如果實體是由它自己消耗那麼它就是一個聚合根,如果你想爲了得到一個「代理」的實例,並直接從你的消費者代碼中調用方法,那麼它應該有它自己的存儲庫,否則如果它被作爲「Office」的一部分使用,並且它的方法從它的根「Office」調用,那麼它不是一個聚集根,你不需要從存儲庫中獨立地獲取它。

將此規則應用於所有實體以決定爲其創建存儲庫。

+0

好吧,看起來好像幾乎每個實體最終都會有一個存儲庫類,我擔心這是一種反模式。 – modelMan 2012-01-10 17:42:37

+0

我不認爲這是一種反模式爲什麼會這樣?如果你的用例是獲取並保存每個實體,那麼你需要爲每個實體創建一個存儲庫 – 2012-01-10 22:03:57

0

我沒有存儲庫的經驗,但我建議如果你打算有多種方式來搜索你的代理,我會建議創建一個標準接口/類。這將允許您使用單個方法調用(名字/姓氏,名字/城市等)執行多種類型的組合搜索。

(我喜歡使用的接口,以保持我的應用程序和數據源去耦)

public IEnumerable/IQueryable<IAgent> Get(IAgentCriteria Criteria) 
{ 
    if (Critiria == null) throw new ArgumentNullException(); 

    var result = entities.Agents; 

    if (!string.IsNullEmptyOrWhiteSpace(Criteria.FirstNameStartsWith)) 
    { 
    result = result.Where(x => x.FistName.StartsWith(Criteria.FirstNameStartsWith)); 
    } 

    // etc etc 
} 
相關問題