Asp.net

一個儲存庫應該呼叫另一個儲存庫嗎?或者儲存庫應該呼叫服務層嗎?

  • September 2, 2009

我試圖弄清楚如何解決這個問題。我必須將一些數據插入到 2 個表中,我們稱它們為表 A 和表 B。

Table A has these columns
AId<PK>
A1 
A2
A3

Table B has
AId<PK>
A1
B2
B3
B4

現在我的第一個問題是另一個儲存庫是否應該呼叫另一個儲存庫?我認為這不會解決我目前的問題,但我只想知道這一點以供將來參考?

現在談談我的問題。

當我在儲存庫層(TableARepository)中呼叫創建來創建表 A 時。我也立即為表 B 創建欄位。

// linq to sql.
   TableA myATable = new TableA();
   dbContext.myATable.A1 = "hi";  // all these values would come from parameters.
   dbContext.myATable.A2 = "bye";
   dbContext.myATable.A3 = "go";

   dbContext.myATable.insertOnSubmit(TableA);
   dbContext.SubmitChanges();

   TableB myBTable = new TableB();
   dbContext.myBTable.AId = myATable.AId;
   dbContext.myBTable.A1 = myATable.A1;
   dbContext.myBTable.B2 = "2";
   dbContext.myBTable.B3 = "3";
   dbContext.myBTable.B4 = "4";

   dbContext.myATable.insertOnSubmit(TableB);
   dbContext.SubmitChanges();

所以我認為這很好,我認為我不需要為此或服務層呼叫 myBTable 儲存庫(創建 tableB)。

現在問題來了。只有當且僅當它不等於“hi”時,TableB 表才應該將資訊插入到該表中。

so param1 != "hi"  // insert 
  param1 == "hi"  // ignore and only insert table A

所以這意味著我必須像這樣包裝我的 TableB

if(param1 != "hi")
{
  TableB myBTable = new TableB();
   dbContext.myBTable.AId = myATable.AId;
   dbContext.myBTable.A1 = myATable.A1;
   dbContext.myBTable.B2 = "2";
   dbContext.myBTable.B3 = "3";
   dbContext.myBTable.B4 = "4";

   dbContext.myATable.insertOnSubmit(TableB);
   dbContext.SubmitChanges();
}

現在我不確定我是否應該在這裡執行此操作,因為這看起來幾乎像業務邏輯。但與此同時,我不確定如何執行此業務邏輯,因為無論哪種方式,我仍然必須傳入要插入到 create 方法中的值,即使它為空(A1 是一個可為空的欄位)。

所以我應該在 TableA.Id、A1 中呼叫 tableB 服務層傳遞並檢查 A1 是什麼。如果好,那麼去 TableB 儲存庫並以這種方式插入它?

所以 TableARepostiory -> TableB 服務層 -> TableBRepository(如果發現那個值!=“hi”)。

所以我不確定該怎麼做。

不 - 我想不出一個儲存庫呼叫另一個儲存庫或另一個服務的原因。他們唯一關心的應該是持久化您的實體並從數據儲存中檢索實體。除了底層域之外,他們應該對應用程序的大多數方面一無所知。

聽起來您假設它們應該是每個表的儲存庫,這是不正確的。每個聚合根都應該有一個儲存庫,並且該儲存庫應該負責將數據儲存到所有底層相關表中。儲存庫可以有一些關於在何處或如何保存數據的邏輯,但最好盡可能將其封裝在一個公共區域中。

例如,如果您有 person 對象並且需要根據性別保存到不同的表中,您可以使用繼承( if (person is Woman) save here…)或對象的屬性( if (person.Gender == Gender.Female) 保存在這裡…) 或規格(如果 (FemaleSpecification.IsSatisfiedBy(person)) 保存在這裡…)。

引用自:https://stackoverflow.com/questions/1364461