簡體   English   中英

存儲庫模式:如何在C#中實現包含謂詞的基本存儲庫?

[英]Repository Pattern: How to implement a basic Repository including a predicate in C#?

我是存儲庫的新手。 我剛剛閱讀了有關實現謂詞和工作單元(福勒)的信息。 我見過類似以下內容的存儲庫接口:

public interface IRepository<ET> {
    ET        Add( ET entity);
    ET        Remove( int id);
    ET        Get( int id);
    IList<ET> Get(Expression<Func<T, bool>> predicate);
}

當然,工作單元將向新存儲庫注入數據上下文(Microsoft風扇),其中新的工作單元將具有.Save()方法,在所有數據上下文上調用Save。

沒有Edit方法,因此我假設您可以修改從存儲庫中彈出的任何實體,然后在工作單元中調用保存更改。

這個對嗎? 漏了嗎 我想念什么? OrderBy的方法不必永遠都在存儲庫中嗎? 分頁(.Skip()。Take())是否應在謂詞中以某種方式實現?

鏈接到示例代碼非常有用,尤其是如何在存儲庫中實現謂詞。

如果您指的是Entity Framework,我建議您閱讀以下內容: http : //blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns- with-entity-framework-4-0.aspx

更新:

我不是存儲庫模式方面的專家,但是我現在確實在我的項目中使用它。 部分形式的性能,以下是我從此設計模式中發現的好處:

1,簡化所有實體的CRUD操作實施。 具有一個接口:

public interface IDataRepository<T> where T : class

那么您將能夠非常輕松快捷地復制其他人

public class EntityOneRepository : IDataRepository<EntityOne>
public class EntityTwoRepository : IDataRepository<EntityTwo>

2,保持我的代碼干燥。 一些實體可能有自己的數據處理方法。 (即存儲過程),您可以輕松擴展它,而無需接觸其他存儲庫。

public interface IDonationRepository : IDataRepository<Donation>
{
//method one
//method two
//....
}

對於分頁,可以通過Skip()和take()完成,也可以在數據庫中定義自己的SP,然后通過EF4調用它。 在這種情況下,您也將從數據庫緩存中受益。

一段時間后,保持代碼的清潔和邏輯可讀性對於更好的應用程序結構也很重要。

您介紹的存儲庫界面是一個非常易於使用的CRUD界面,可以在許多類型的應用程序中很好地工作。 通常,我寧願在存儲庫中沒有分頁和排序參數或選項,而寧願返回IQueryable並讓調用方將這些類型的操作組合到查詢中(只要您是IQueryable,就可以使用EF之類的技術或nHibernate可以將這些運算符轉換為SQL-如果您退回到IList或IEnumerable,它們全部在內存操作中)。

盡管我避免分頁和排序,但我可能會對存儲庫進行更具體的操作,以使業務邏輯免受某些細節的影響。 例如,我可以從IRepository擴展IEmployeeRepository並添加GetManagers方法,或類似的方法來隱藏查詢中所需的Where表達式。 這完全取決於應用程序和復雜性級別。

關於您的帖子中這句話的重要說明:

當然,工作單元將向新存儲庫注入數據上下文(Microsoft風扇),其中新的工作單元將具有.Save()方法,在所有數據上下文上調用Save。

確保在每個工作單元中使用單個數據上下文/對象上下文,因為上下文本質上是基礎工作單元。 如果您在同一邏輯事務中使用多個上下文,那么您將有效地擁有多個工作單元。

我在此項目中有幾個示例實現: http : //odetocode.com/downloads/employeetimecards.zip

如果您閱讀以下附帶的文章,則代碼可能更有意義: http : //msdn.microsoft.com/zh-cn/library/ff714955.aspx

希望能有所幫助,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM