2009-08-18 21 views
0

我正在爲存儲庫構建一組CRUD屏幕。成員對象足夠大,我不想一次將大量內容加載到內存中 - 就像生成搜索結果一樣。由於所有我需要的搜索結果都是幾個屬性 - 例如「名稱」和「ID」 - 我可能只是查詢底層數據庫 - 但我不想繞過存儲庫,因爲那會否定其很大的價值。存儲庫模式:列出成員的策略

我找到的存儲庫模式介紹和教程不包括這種情況。他們專注於一次保存/檢索/刪除一個完全填充的對象。

我對懶惰加載對象的代理模式很熟悉。但那是大男孩怎麼做的?這個問題是否有完善的解決方案?

回答

1

如果你嚴格遵守DDD,我認爲你的搜索應該返回完全填充的對象。但有時你必須彎曲規則。

我可以告訴你不要做什麼:

  1. 不要僅檢索您需要的數據,仍然返回實體類的未完全填充的實例。這很容易變成災難。您最終會看到不同的查詢方法,這些查詢方法似乎會返回完全填充的實體 - 但實際上它將取決於所調用的查詢方法。期待混亂。

  2. 不要推出自己的懶惰初始化方案。這是困難和容易出錯的。我曾經這樣做過,我可以肯定地說這不值得。

那麼,還有什麼呢?我的投票是獲取您需要的數據,並創建一個只包含您計劃填充的字段的類,並返回這些類的列表。現在,任何一個調用你的搜索函數的人都知道他們正在得到什麼:實際數據的一個子集。當你需要完整的實體時,你將不得不再次訪問數據庫。

這裏是我的意思Java中的例子:

public class CakeRepository { 
    public List<CakeProjection> getCakesByManufacturer(String manufacturer); 

    public Cake getCake(long id); 

    ... 
} 

public class CakeProjection { 
    private long id; 
    private String cakeName; 

    ... 
} 
+0

是的,是的,是的,這一切都合情合理。非常感謝你。現在我只需要爲這些部分實體提供一個名稱。 「投影」,呵呵......? – Metaphile 2009-08-18 21:00:54

0

您可以在存儲庫接口上定義查詢,以便撤回您之後的數據。

然而,我認爲大男孩使用ORM層(如Hibernate),並將定義的查詢傳遞給ORM。

+0

因此,如果一個查詢指定我只是在名稱和ID感興趣,我的倉庫可以返回一組對象與它們的主要屬性的設置爲NULL? – Metaphile 2009-08-18 20:35:28

+0

接受的答案似乎對我很好。 – mcintyre321 2009-08-18 22:01:26