簡體   English   中英

存儲庫模式的最佳實踐是什么 - 每個表的存儲庫?

[英]What is best practise for repository pattern - repo per table?

在處理具有多個大型主表的初始項目時,存儲庫模式似乎運行良好。

然而,隨着項目的發展,它似乎有點不靈活。 假設您有很多掛在主表之外的子表,您是否需要為每個表創建一個存儲庫?

例如

CustomerAddress Record 有以下子表:

-> 縣

-> 國家

-> 客戶類型

在 UI 上,需要顯示 3 個下拉列表,但是為上述每個表編寫一個存儲庫來選擇下拉列表的數據有點乏味。

是否有最佳實踐/更有效的方法來做到這一點?

例如,假設您有一個主 CustomerAddress 存儲庫,我猜它是“聚合根”,它從基本 repo 接口繼承了主要的 CRUD 操作。

以前我已經縮短了聚合根並直接進入了這些表的上下文。

例如

public Customer GetCustomerById(int id)
{
  return Get(id);
}

public IEnumerable<Country> GetCountries()
{
  return _ctx.DataContext.Countries.ToList();
}

ETC...

但有時感覺不對,因為國家不是客戶的一部分,但我覺得我需要將它附加到某些東西上,而不必為每張桌子創建數以萬計的存儲庫。 每張桌子的回購對我來說也絕對不合適。

我當然不會為每個表創建一個存儲庫。 相反:我會定義一個適用於每個表的通用存儲庫。 通過這樣做,您可以節省大量代碼,並且當您在該 class 上實現IQueryable時,它將允許您對它使用 LINQ 查詢,並且您可以將您的 O/RM 框架隱藏在一個抽象后面,這使您可以有效地編寫單元測試。 我為此寫了一篇文章,請參閱偽造您的 LINQ 提供程序

回應提問者自己的回答:這對我來說沒有意義; 盡管您可能仍然有一個很好的用例,但我沒有關注。 第 1 點和第 2 點...如果您需要專門的方法,那么看起來它們屬於自己的存儲庫。 第 2 點:是的,這需要一個實現。

在存儲庫之間共享,較小的存儲庫是問題(是否需要),我確實很欣賞這個問題/問題,但是這個線程上的家伙'引導我對每張桌子 1 個存儲庫沒問題,包括有一個'服務層”,盡管他們沒有給出任何例子,而且我還沒有嘗試過(目前我的做法,無論好壞,都是擁有更大的 repo 份額或實例化它需要的較小的 repo 份額) :

每個表一個存儲庫還是每個功能部分一個存儲庫?

首先,您發布的代碼不是存儲庫模式。 集合類界面在哪里? 如果它是一個聚合,它應該只返回聚合類型。

當能夠 select 不同類型時,存儲庫模式並沒有提供太大的靈活性。 存儲庫模式遵循集合接口(插入/添加/更新/刪除/獲取/等),鏡像 memory 中的事物,它通常只檢索類型。 因此,如果您要使用存儲庫模式,您需要 select 所有 CustomerAddresses 然后*過濾國家/地區。 我建議你轉向不同的模式,這允許更大的靈活性,即 DAO。

如果這些東西總是要通過 CustomerAddress 維護,那么切換模式並創建一個 DAO class,它為您需要的其他類型的東西提供一些其他的 getter。


在更通用的說明中,為需要而構建

永遠不要盲目地創建存儲庫類,這是維護的噩夢。 我唯一一次主張為每個表創建一個 repo 是當你在做 CMS 之類的事情時,並且需要能夠創建所有內容。

例子:

因此,您有一個將客戶和國家/地區聯系在一起的客戶地址,但是您還有一些其他流程需要能夠對國家/地區進行 CRUD。 因此,您需要*存儲庫來操作 Country,如果您遵循 DRY,您不希望有重復的邏輯來操作 Country。 您將擁有一個使用 Country 存儲庫的客戶存儲庫。

我在這里回答我自己的問題,因為雖然這些建議肯定有用,但我覺得我有更好的解決方案。 雖然我不必為每個表創建底層存儲庫,因為我有一個通用存儲庫基礎 class 接口(獲取、添加、刪除),但我仍然必須:

1)編寫接口以訪問任何專門的方法(通常這些是查詢)

2)編寫那些實現

當我想要檢索的只是國家列表或一些用於填充下拉列表的簡單類型時,我不一定要這樣做。 如果您有 10 個引用類型表,請考慮所需的工作量。

我決定做的是創建一個名為 SimpleRepo 的新 class 和 ISimpleRepo 接口,它公開了 1-2 個方法。 雖然我通常不喜歡從 repo i/f class 中公開 IQueryable 接口,但我不介意這里,因為我想要提供的靈活性。 我可以簡單地公開一個提供靈活性掛鈎的“Query()”方法。 我可能需要這個來專門排序或過濾。

每當服務需要使用一些簡單的數據時,就會傳入 ISimple<T> 接口,其中 T 是表/類。

我現在無需為這些簡單的數據創建接口/類。 有人想嗎?

暫無
暫無

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

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