2009-11-20 47 views
3

我想知道推薦的方法是用IRepository模式處理關係數據。IRepository和關係數據

我的數據庫與括號中列名如下表:

  • 計劃(PlanId,名稱,CreationDate, ModifiedDate,ViewId)
  • 區(areaID表示,名稱,NTOP,nLeft, nRight ,nBottom)
  • 視圖(ViewId,NTOP,nLeft,nRight, nBottom)
  • PlanAreas(PlanId,areaID表示)

其中每個計劃可以有零個或多個區域但只有一個視圖,因此Plans.ViewId是FK到Views.ViewId。在PlanAreas中,兩列都是FK到相應的表格。

有時候我的應用程序可能想在區域上獨立行事,但通常我會同時加載,保存,刪除一個計劃及其所有組件(區域,視圖)。

我已經開始沿着小路....

public interface IPlanRepository 
{ 
    IEnumerable<MyModel.Plan> GetAll(); 
    MyModel.Plan GetByName(string sName); 
    MyModel.Plan GetById(string sId); 
    void Delete(MyModel.Plan plan); 
    void SaveOrUpdate(MyModel.Plan plan); 
} 

public class Plan 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public DateTime Creation { get; set; } 
    public DateTime Modified { get; set; } 
    public MyModel.View View { get; set; } 
    public IList<MyModel.Area> Areas { get; set; } 
} 

public class View 
{ 
    public Guid Id { get; set; } 
    public IEnvelope Envelope { get; set; } // encapsulates top, left, bottom, right 
} 

// etc. 

的計劃是相當複雜的,所以實際上是更多的屬性,但是這是一個良好的開端。所以現在的問題:

  • 我需要IViewRepository和IAreaRepository嗎?
  • 在IPlanRepository中實現方法時,是否要執行抓取與計劃相關的關係數據(即區域和視圖)的所有工作並返回完全填充的計劃對象?
  • 或者是否有更高級的「聚合器」(因缺乏更好的詞)在計劃返回後填寫屬性會更好?事情是這樣的:

    Plan GetPlanById(string sId) 
    { 
        Plan myplan = new Plan(); 
        IPlanRepository planrepo = new PlanRepoImpl(); 
        myplan = planrepo.GetById(sId); 
        IViewRepository viewrepo = new ViewRepoImpl(); 
        myplan.View = viewrepo.GetByPlanId(sId); 
        return myplan; 
    } 
    

現在我打算使用LINQ-SQL對我的數據訪問,因爲我很熟悉它,我可以很快做到這一點。我可能會轉而採取其他措施,但現在我想保持簡單。

+0

爲什麼你需要存儲庫模式?爲什麼不使用Linq2Sql上下文? –

+0

我在問,因爲對於一般問題沒有最佳方法。有具體問題的最佳方法。你需要明確你需要什麼。 –

+0

因爲LINQ-SQL上下文是一個數據訪問類,並且我的數據庫對象和我的域模型對象之間沒有1:1的對應關係。另外,我希望具有更改數據訪問策略的靈活性,而不必重寫邏輯層。 –

回答

0

您絕對不需要存儲計劃的子部分。由於它們在模型內部,因此您可能不需要直接訪問它們,如果您確實需要參考該計劃。

既然如此,你會想要使用該計劃作爲您的主要參考點。使用完整填充的計劃對象,然後可以找出任何你想知道的與之相關的區域和視圖。

編輯: 我一直在閱讀埃裏克埃文斯DDD book最近和他的存儲庫,他使用了類似的風格,我已經在上面描述。

+0

與@bruno基本上是一樣的答案,但我已經給你檢查書籍參考,因爲你有更少的分數。 –

1

您應該爲每個Aggregate Root實施一個存儲庫。所以,在我看來,你在這裏只需要一個倉庫。是的,我認爲知識庫應該負責構建一個實體及其所有相關數據。

2

如果您不對計劃的子部分進行回購,您如何處理只加載所需的部分?例如,如果我想獲取系統中所有計劃的列表並選擇一個詳細查看,則絕對不希望返回完全填充的計劃對象以顯示摘要列表。這會在很多方面殺死性能。相反,你只需要一個精益計劃對象,也許它需要計算它有多少面積(而不是所有人口密集的區域)。而且,最重要的是,您希望以可重複使用的通用方式完成所有這些工作。

我會傾向於您想與之合作的每個主要實體的單獨存儲庫的概念。然後通過某種聚合器來管理這些人之間的關係。或者,也許您將屬性引用和關聯的委託(或表達式樹)的列表傳遞給您的聚合根回購庫上的每個檢索方法,以告知它要填寫哪些項目。但你仍然有二級,三級,四級等關係的問題。回到最初的想法,只需要顯示計劃列表和計數區域......您不想返回所有區域以獲得計數。

而這只是檢索。如果您的計劃有5個區域,並且每個區域都有一系列信封,並且您決定添加,編輯或從區域刪除信封,該怎麼辦?當你在計劃級別時,你將如何走樹來找出更新的內容?似乎操作Envelope和Envelope repo會更有意義。

在我看來,回購處理數據檢索和另一個引擎/類處理關係修復。