我會使BlogEntry它自己的聚合根,與它自己的存儲庫。通過查詢具有給定BlogID的所有BlogEntry的BlogEntry存儲庫,您可以獲得特定Blog的BlogEntry實例。由於實現存儲庫有多種不同的策略(一個通用存儲庫與許多獨立的查找程序方法,另一個需要複雜的規範對象等),所以我無法提供有關存儲庫的詳細信息。存儲庫的查找器方法應該支持分頁。
public class Blog
{
public int ID {get;set;}
// other stuff
}
public class BlogEntry
{
public int ID {get;set;}
public int BlogID {get;set;}
}
public class BlogEntryRepository
{
public IEnumerable<BlogEntry> FindByBlogID(
int blogID, int pageIndex, int pageSize)
{
// implementation
}
}
另外,(也用BlogEntry建模爲集合根),您可以將BlogEntryID集合添加到您的Blog類中。這比在Blog類中使用BlogEntry實例本身更好,因爲當您想要獲取Blog實例時,要加載的數據要少得多。使用這些ID,您可以選擇它們的子集並將它們傳遞到接受ID集合的BlogEntry存儲庫方法中。換句話說,在您的域中會有更多邏輯支持分頁,並且會在存儲庫中使用更通用的getter。
public class Blog
{
public int ID {get;set;}
public IEnumerable<int> BlogEntryIDs {get;set;}
// other stuff
}
public class BlogEntry
{
public int ID {get;set;}
public int BlogID {get;set;}
}
public class BlogEntryRepository
{
public IEnumerable<BlogEntry> Get(IEnumerable<int> blogEntryIDs)
{
// implementation
}
}
使用這種方法會像
// get the second page
var entries =
blogEntryRepo.Get(blog.BlogEntryIDs).Skip(1 * PAGE_SIZE).Take(PAGE_SIZE);
在數據庫中,你會返回多行,每個博客條目。 (我也傾向於返回多個結果集以獲取來自一個數據庫中所有相關表的所有行的往返行程,還利用SQL 2005的ROW_VERSION函數啓用數據庫分頁)。典型的使用情況顯示與博客相關聯的(例如多於幾千)BlogEntry實例數量過多。一堆太多的int會讓我對性能和內存保持警惕。
我喜歡你的答案,這是很有道理的。 「除非」部分怎麼樣 - 如果數組很大,你會怎麼做。從性能記憶的角度來看,當你在20歲以後從另一臺機器上的數據庫中讀取一千條記錄似乎是一個糟糕的主意(如你所寫)。 – Kristoffer 2009-10-23 05:56:11
在「除非」的情況下,我會採用第一種方法。我添加了示例代碼以使兩種方法更清晰。在第二種方法中,使用BlogEntryID集合,即使您可能要求數百或數千行,但您只需要每行有一個整數列。要確定這是否可以接受,唯一的方法是在某個級別建立性能要求並進行一些初步測試。或者只是採用第一種方法。 – 2009-10-23 06:33:41