[英]What type of architecture is this called?
對於我當前正在開發的Web應用程序(ASP.NET MVC),我們具有以下架構:
Data Access Layer
:用於將數據持久存儲到任意數據庫的邏輯 Domain
:數據模型 Service Layer
:業務邏輯(例如訂單處理,帳戶管理等) Controller
:使用服務並向視圖提供數據/從視圖接收數據 View
:用戶的用戶界面 本質上,我采用了Model
並將其分為DAL
, Service Layer
和Domain
。 我覺得將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
項目/程序集: API
和Domain
定義的接口的實現。 在這里實現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。
由於您已將DAL與域模型分開,並且還具有服務層,因此您似乎正朝着DDD(域驅動的設計)邁進,這里是有關這種方法的討論,可能會很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.