同一層的洋蔥架構依賴關係:基礎架構和 Web 通信
我正在使用Jeffrey Palermo 描述的Onion Architecture設計一個 ASP.NET MVC 應用程序。
這是一個 ASP.NET MVC 2.0 項目,我要求使用專用視圖模型對所有視圖進行強類型化——我們不會將域模型傳遞給我們的視圖。我們正在使用 AutoMapper 進行翻譯——AutoMapper 在基礎設施中是孤立的,Web 不知道也不關心 AutoMapper 正在被使用。
目前,我正在 Web 項目中定義 IViewModelMapping 介面——僅僅是因為該服務將由控制器使用,並且它可以直接訪問自己的視圖模型。通過這種方式,界面可以訪問域模型(在核心中)和視圖模型(在 Web 中)。
為了提供 IViewModelMapping 介面的實際實現,我在 Infrastructure 項目中創建了一個 ObjectMapping 命名空間,它將實際映射實現隔離到 onion 的 Intrastructure。為此,這將要求基礎架構同時依賴於核心和 Web。
我的問題是:因為這兩個項目在技術上都位於洋蔥的郊區(在同一層)——是否允許一個項目依賴於該層中的另一個項目?有沒有人注意到這種設計有任何潛在的缺陷?
另一種設計是將 IViewMapper 介面移動到 Core 中——但這是不可能的,因為 Core 無權訪問 ViewModel 類。我也可以將視圖模型移動到 Core,但我覺得它們不屬於那裡,因為它們特定於 UI 層。
提議的架構如下——注意基礎設施依賴於Core AND Web。Web 保持隔離,只能訪問核心業務邏輯。
<http://www.matthidinger.com/images/onion-arch.png>
您不希望基礎架構依賴於 UI(Web)是正確的,但我有時會違反該規則。
我想用 Map() 方法創建 IMapper,而不是 IViewModelMapping。然後,介面可以具有可能與視圖模型映射有關的實現,或者可能只是正常映射。無論哪種方式,該介面都可以在 Core 中,因為它在語義上沒有綁定到任何類型的模型。
很棒的圖形。我希望我回答了你的問題。Onion 架構的整體理念是讓您的業務邏輯和模型保持在應用程序的中間(核心),並將您的依賴項盡可能向外推。