1 回答

TA貢獻1810條經(jīng)驗 獲得超5個贊
我盡可能使用 Mehdime 的上下文范圍,因為我發(fā)現(xiàn)它是一個工作單元的出色實現(xiàn)。我同意卡米洛關(guān)于不必要的分離的評論。如果 EF 被信任用作您的 DAL,那么它應(yīng)該被信任按設(shè)計工作,以便您可以完全利用它。
在我的例子中,我的控制器管理 DbContextScope,我將存儲庫模式與我的實體的 DDD 設(shè)計結(jié)合使用。存儲庫充當(dāng)與 DbContextLocator 作用域和定位的上下文交互的看門人。在創(chuàng)建實體時,存儲庫充當(dāng)帶有“Create{X}”方法的工廠,其中 {X} 代表實體。這確保提供了創(chuàng)建實體所需的所有必需信息,并且實體在返回之前與 DbContext 相關(guān)聯(lián),從而保證實體始終處于有效狀態(tài)。這意味著調(diào)用上下文范圍的 SaveChanges 時,綁定服務(wù)會自動為實體分配 ID。ViewModels / DTOs 是控制器返回給消費者的東西。您還可以選擇在 DbContextScope 的邊界內(nèi)調(diào)用 DbContext 的 SaveChanges,這也會在上下文范圍 SaveChanges 之前顯示 ID。當(dāng)您想要為松散耦合的實體獲取 ID 時,這更像是一種非常極端的情況。(無 FK/映射關(guān)系)存儲庫還為“刪除”代碼提供服務(wù),以確保管理所有相關(guān)實體、規(guī)則等。雖然編輯實體屬于實體本身的 DDD 方法。確保所有相關(guān)實體、規(guī)則等都得到管理的代碼。雖然編輯實體屬于實體本身的 DDD 方法。確保所有相關(guān)實體、規(guī)則等都得到管理的代碼。雖然編輯實體屬于實體本身的 DDD 方法。
可能有一個更純粹的論點,即這種將域或 EF 特定問題的細(xì)節(jié)“泄漏”到控制器中,但我個人的觀點是,在服務(wù)層的有界上下文范圍內(nèi)“信任”實體和 EF 的好處遠遠大于一切。它更簡單,并且允許您在代碼中有很大的靈活性,而不需要傳播近乎重復(fù)的方法來為消費者提供過濾數(shù)據(jù),或復(fù)雜的過濾邏輯來從服務(wù)層“隱藏”EF。我遵循的基本規(guī)則是實體永遠不會在其上下文范圍的邊界之外返回。(無需分離/重新附加,只需選擇到 ViewModels,并根據(jù)傳入的視圖模型/參數(shù)管理實體上的創(chuàng)建/更新/刪除。)
如果您可以提供更具體的問題/示例,請隨時添加一些代碼概述您看到這些問題的地方。
- 1 回答
- 0 關(guān)注
- 132 瀏覽
添加回答
舉報