簡體   English   中英

.NET:具有存儲庫、服務和適當 DI 的 n 層架構

[英].NET: n-layered architecture with repository, services and proper DI

可能是這個問題已經被討論和回答了,我只是找不到合適的鏈接。 問題是:如何使用存儲庫和 DI 正確實現 3 層(表示、業務邏輯、數據訪問)。

“通常的 3 層架構”:

在此處輸入圖像描述

“正確的 3 層架構(或干凈的架構)”:

在此處輸入圖像描述

這樣我們的 BL 是自包含的,對 UI 或 DAL 沒有任何依賴,這很好。

我想實現一個存儲庫來對數據存儲進行另一個抽象。 在這種情況下,我在 BL 中有 IRepository 接口,BL 中的所有內容都是針對這個通用接口進行編程的。 接口的實現在 DAL 中。 出現的問題是如何注冊存儲庫,如果我的組合根(我注冊依賴項的地方)在表示層中,因為它是我的應用程序實際啟動的地方。 但它沒有對 DAL 的引用。 選項是:

  1. 在運行時按名稱 (?) 查找 DAL 程序集並使用任何 DI 容器的自動注冊功能
  2. 從 Presentation 到 DAL 的引用,並將 DAL 中的所有類型都作為內部/私有類型,只有 1 個“標記”類型(也就是說,如果定義了此類型,則查找其中的程序集),然后使用自動注冊。

問題是互聯網上的很多文章實際上都顯示了這個問題中的圖片,但是在他們的代碼中有從 Presentation 到 DAL 的引用,這是誤導性的。 示例: https://learn.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/common-web-application-architectures (圖 5-9 表示這是一個運行時依賴項,但在他們的代碼中https://github.com/dotnet-architecture/eShopOnWeb這是一個參考)

如果 Presentation 有對 DAL 的引用(在干凈的架構中,這個層通常稱為基礎設施),以便在 DI 中正確注冊依賴關系,那沒關系。 主要是確保在基礎設施 (DAL) 中實現的類不會在表示層的其他任何地方使用(通常這是在合並拉取請求時控制的,以及為類指定訪問修飾符(內部)在基礎設施中)。

Jason Taylor 在 .NET 中有一個很好的例子來實現一個干凈的架構

暫無
暫無

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

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