2009-05-17 38 views
1

想象一下,您有一個與其他實體有某種關係的實體,並且您只想加載其中一些實體以在不同視圖中顯示它們。定義在控制器中加載哪些數據是一種很好的做法嗎?

例如,假設這個實體:

public class Category 
{ 
    public int id; 
    public Category child; 
    public Category parent; 
} 

在視圖「ShowChild」你不想因爲你沒有顯示它加載「父」屬性。

因此,考慮到這種情況,我在我的存儲庫中實現了一個非常漂亮的「系統」,以從數據庫加載實體,只填寫我想要的屬性。所以,現在

我有一個類的實例只加載ID和子屬性|

分類類別= repo.FindCategory(LoadLevel.Child)ID,(INT)(LoadLevel.basic):是這樣工作的。我在這裏面臨的困境是,如果我在我的serviceLayer中定義LoadLevel(它應該是),我將不得不在我的服務類中編寫兩個方法,「LoadCategoryWithChild」和「LoadCategoryWithParent」,一個用於每個視圖(DRY違規?)。

public class CategoryService 
{ 
    public Category LoadCategoryWithChild(int id) 
    { 
     int loadlevel = (int) (LoadLevel.Basic | LoadLevel.Child); 
     return repo.FindCategory(id, loadlevel); 
    } 
} 

OR,其他選項我看到的是定義在控制器(MVC違規?)的loadlevel和我的服務類實現只有一個方法:

public class CategoryService 
{ 
    public Category LoadCategory(int id, int loadlevel) 
    { 
     return repo.FindCategory(id, loadlevel); 
    } 
} 

哪種選擇會比較好?我認爲DRY違規更糟糕,因爲它意味着編寫了大量冗餘代碼。

回答

1

我絕對比較喜歡第二種解決方案。我不認爲控制器給服務類提供它需要的數據的提示是一個問題(坦率地說,它是通過調用函數A而不是函數B在第一種解決方案中做的同樣的事情)。

這樣,來電者知道什麼有效的選項是

0

這可能是對象關係映射的頭號問題。大多數ORM解決方案通過延遲加載對象屬性來解決它,因此您只需要一種迎合大多數用例的加載機制。使用附加屬性的少數函數可以通過代理透明地加載View所需的內容。

就我個人而言,我不是上述解決方案或實際上透明代理的第三種解決方案的粉絲。然而,代理解決方案將更加一致地工作,在視圖層中進行微小更改時失敗頻率較低,主要影響通常只是一點點的性能。證明問題時,您可以隨時進行優化。

作爲一個例子,Hibernate使用了這種方法,儘管你必須告訴它一個屬性是否是懶加載的。在Hibernate中通過代理進行延遲加載也無法在所有情況下進行延遲加載,因爲它需要在事務中進行。這些限制是出於實際性能原因。在數據庫映射方法中,代理/延遲加載是最容易使用的,但它帶有其自身的複雜性。

+0

您仍然必須(N)Hiberante何時延遲加載,何時不加載。 – Paco 2009-05-17 19:11:51

0

我想,雖然改變的第二個參數不是一個int和是一個枚舉類型,我建議:

public Category LoadCategory(int id, params LoadLevel[] levels) 
{ 
    int loadLevel = LoadLevel.Basic; 

    foreach (var level in levels) 
     loadLevel = loadLevel | level; 

    return repo.FindCategory(id, loadlevel); 
} 

用法示例:

LoadCategory(0, LoadLevel.Parent, LoadLevel.Child); // self + parent+ child 
LoadCategory(1, LoadLevel.Child); // self + child 
LoadCategory(2); // self only 
相關問題