簡體   English   中英

這叫什么類型的架構?

[英]What type of architecture is this called?

對於我當前正在開發的Web應用程序(ASP.NET MVC),我們具有以下架構:

  • Data Access Layer :用於將數據持久存儲到任意數據庫的邏輯
  • Domain :數據模型
  • Service Layer :業務邏輯(例如訂單處理,帳戶管理等)
  • Controller :使用服務並向視圖提供數據/從視圖接收數據
  • View :用戶的用戶界面

本質上,我采用了Model並將其分為DALService LayerDomain 我覺得將Model所有邏輯塞滿會使我的代碼過於復雜。 此外,我覺得它可以使我清晰地表達我的業務邏輯,而無需使控制器做過多的工作。

那么我的問題是:這種類型的架構叫什么?

作為第二個問題 :這種類型的體系結構有意義嗎? 如果沒有,我做錯什么了嗎?

您對DDD的看法是正確的,具體取決於域和服務層的厚度。 DDD表示,知識(即業務邏輯)應納入領域模型。 將數據訪問問題轉移到DAL與DDD一致,但是我認為將業務邏輯轉移到服務層是不對的。 如果您有一個薄的“域”數據模型”層(主要用於實體)和一個厚的“服務”層(主要是“業務邏輯”),則您可能具有貧乏的域

同樣,在DDD中,技術上也沒有“服務層”。 可能有一個“應用程序層”,但它應該很薄,並且僅負責應用程序流/管理域類的生命周期。 實質上,這是Controller在.NET MVC中所做的工作,是在Web http上下文中管理應用程序流。

如果將模型中的所有邏輯塞滿,會使您的代碼過於復雜,那么我想聽聽“過度復雜”的含義示例。 您可能正在正確地建模復雜的域,或者有可能您已經使用DDD模式簡化了事情。 我會說,正如您在問題中列出的那樣,拱門不是DDD。 我將其稱為“分層體系結構”,但這是因為我更喜歡僅在談論物理拱門時使用“層”一詞。 但是,您的邏輯體系結構是分層的。

我真的很喜歡達林在他的回答中鏈接到洋蔥拱門。 我正在成為它的忠實擁護者,而且我發現它並不是DDD獨有的。 如果您的代碼使用依賴項注入來解決運行時實現中的接口依賴項,則您可能會有一種形式的洋蔥拱。 例如,您是否在DAL中定義了任何接口? 這些接口的實現是否在運行時解決?

這是我在新項目中開始使用的拱門的示例。 它是洋蔥+ DDD的組合:

  • API Project / Assembly:所有其他層使用的通用接口,枚舉,類和擴展方法。 不必與Domain分開,但可以。

  • Domain項目/程序集:所有實體和業務邏輯。 僅取決於API 使用工廠,服務,規范,存儲庫等DDD模式。還包含API中未定義的更多特定於域的接口。

  • Impl項目/程序集: APIDomain定義的接口的實現。 在這里實現EF DbContext,以及日志記錄,電子郵件發送等。所有這些實現都是依賴注入的,因此從技術上講,您可以有多個Impl項目/程序集。

  • UI項目/程序集:這是MVC項目。 控制器直接消耗域表面,並且不經過應用程序或服務層。 控制器使用MVC IoC(構造函數注入)將工廠,服務,存儲庫等中的任何接口依賴項注入到域中。

我在最核心處放置了一個API層,但是您可以將API和Domain項目合並到一個。 無論哪種方式,洋蔥的大肉部分都是“領域”,並且具有內部分層。 例如,服務可能取決於工廠,而工廠取決於存儲庫,而存儲庫取決於實體。

Impl項目就是您在巴勒莫圖中看到的“基礎結構”洋蔥皮。 它與UI一起位於外部邊緣,並且不包含特定領域的知識。 它知道如何使用EF發送電子郵件,存儲/檢索數據,等等。如果需要,您可以使用其中的一種以上-例如,用於數據訪問的1 Impl,用於處理郵件的1 Impl等。

MVC具有控制器和視圖,並專注於UI和Web應用程序流。 任何需要特定領域知識的東西都被委派給該領域,並且將領域類作為構造函數注入到控制器中。 這意味着IoC容器會自動解析域類中所有注入構造函數的接口。

最后一點,針對在API和Domain類中定義的接口進行編程意味着您可以與MVC項目分開對單元項目進行單元測試。

從高層次上講,我將其描述為分層架構。 將其描述為域驅動的設計還將關注較小的模式,例如聚合,存儲庫,有界上下文等。我不能僅從您的描述中看出來。

如果域層位於不引用其他任何層的程序集/程序包中,則它具有Onion Architecture原則的核心,即:

  • 該應用程序圍繞獨立的對象模型構建
  • 內層定義接口。 外層實現接口
  • 耦合方向朝向中心
  • 可以編譯所有應用程序核心代碼,並與基礎結構分開運行

要查找的具體內容是您的DataAccess是否引用Domain。

根據您從哪個角度看,可能會有不同的名稱。 所以它仍然是MVC,只是將您的M分為多個層。 它也可以稱為多層體系結構 (或N層體系結構)。 Jeffrey Palermo還使用了洋蔥架構的概念。

由於您已將DAL與域模型分開,並且還具有服務層,因此您似乎正朝着DDD(域驅動的設計)邁進,這里是有關這種方法的討論,可能會很有用。

暫無
暫無

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

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