2012-03-31 17 views
2

我的數據庫中有二進制數據,我必須在某個時間點將其轉換爲位圖。我在考慮是否適合使用存儲庫並在那裏執行。我的消費者,這是一個表示層,將使用此存儲庫。例如:EF模型和代碼使用者之間的存儲庫使用情況

// This is a class I created for modeling the item as is. 
public class RealItem 
{ 
    public string Name { get; set; } 
    public Bitmap Image { get; set; } 
} 

public abstract class BaseRepository 
{ 
    //using Unity (http://unity.codeplex.com) to inject the dependancy of entity context. 
    [Dependency] 
    public Context { get; set; } 
} 

public calss ItemRepository : BaseRepository 
{ 
    public List<Items> Select() 
    { 
     IEnumerable<Items> items = from item in Context.Items select item; 
     List<RealItem> lst = new List<RealItem>(); 
     foreach(itm in items) 
     { 
      MemoryStream stream = new MemoryStream(itm.Image); 
      Bitmap image = (Bitmap)Image.FromStream(stream); 
      RealItem ritem = new RealItem{ Name=item.Name, Image=image }; 
      lst.Add(ritem); 
     } 

     return lst; 
    } 
} 

這是使用存儲庫模式的正確方法嗎?我正在學習這個模式,我已經在網上看到了很多的例子正在使用的存儲庫,但是當我看了看他們的源代碼,例如:

public IQueryable<object> Select 
{ 
    return from q in base.Context.MyItems select q; 
} 

,你可以看到幾乎沒有行爲除了隱藏數據訪問查詢外,通過他們的方法添加到系統中,所以我很困惑,也許存儲庫是別的東西,我把它弄錯了。最後應該有額外的使用它們的好處嗎?

更新:因爲事實證明,如果在發送數據前沒有更多數據需要完成,您就不需要存儲庫了,但請等待!沒有抽象的LINQ查詢?這樣客戶端必須爲我們提供查詢語句,這些查詢語句可能有點不安全並且難以驗證,所以也許庫也提供了對數據查詢的抽象?如果這是真的,那麼擁有一個存儲庫總是項目架構中的一個基本需求! 然而這個抽象可以通過使用SQL存儲過程來提供。如果兩種選擇都可用,有什麼選擇?

回答

4

是的,這是正確的方法:存儲庫合同服務於應用程序需求,處理應用程序對象。

大多數情況下,你所看到的(壞)例子將任何存儲庫實現都耦合到IQueryable,它可能或可能不會被底層orm實現,畢竟它是實現細節。

IQueryable和IEnumerable之間的區別在處理遠程數據時非常重要,但這正是存儲庫首先要做的事情:它隱藏了您正在處理可能是遠程存儲的事實。對於應用程序,存儲庫只是一個本地對象集合。

更新 存儲庫抽象持久性訪問,這使得從一個特定的持久化實現和口罩本身作爲一個簡單的收集分離的應用。這意味着應用程序不知道Linq2Sql,Sql或使用的RDBMS的類型(如果有的話)。應用程序從回購站發送/接收對象,而回購實際上仍然存在或加載對象。該應用程序不關心回購是如何做到的。

我認爲存儲庫是一個非常有用的模式,我在每個項目中都使用它,這正是因爲它標記了應用程序(作爲定義和處理問題和解決方案的地方)與數據存儲/持久性之間的邊界被保存。

+0

請檢查我的更新。謝謝。 – jim 2012-04-01 15:27:28

+0

看到我更新的答案 – MikeSW 2012-04-01 16:25:30

1

您可以使您的存儲庫成爲通用存儲庫,並且可以從中獲取模式值。並確保您使用Interface(IItemRepository)訪問管理器層中的存儲庫,以便您可以使用新的存儲庫實現方式將存儲庫替換爲另一種數據訪問方法。 Here is an good exampl e如何做到這一點。

+0

你會看看更新並讓我知道你的意見。 – jim 2012-04-01 19:36:12

相關問題