【发布时间】:2011-01-21 03:10:00
【问题描述】:
我正在使用 Jeffrey Palermo 描述的 Onion Architecture 设计一个 ASP.NET MVC 应用程序。
这是一个 ASP.NET MVC 2.0 项目,我要求所有视图都使用专用视图模型进行强类型化——我们不会将域模型传递给我们的视图。我们正在使用 AutoMapper 进行翻译——AutoMapper 在基础设施中是孤立的,Web 不知道也不关心 AutoMapper 正在被使用。
目前,我正在 Web 项目中定义 IViewModelMapping 接口——仅仅是因为该服务将由控制器使用,并且它可以直接访问自己的视图模型。通过这种方式,界面可以访问域模型(在核心中)和视图模型(在 Web 中)。
为了提供 IViewModelMapping 接口的实际实现,我在 Infrastructure 项目中创建了一个 ObjectMapping 命名空间,它将实际映射实现隔离到洋葱的 Intrastructure。在这样做时,这将要求基础架构同时依赖于核心和 Web。
我的问题是:由于这两个项目在技术上都位于洋葱的郊区(在同一层)——是否允许一个项目依赖于该层中的另一个项目?有没有人注意到这种设计有任何潜在的缺陷?
另一种设计是将 IViewMapper 接口移动到 Core 中——但这是不可能的,因为 Core 无权访问 ViewModel 类。我也可以将视图模型移动到 Core,但我觉得它们不属于那里,因为它们是特定于 UI 层的。
建议的架构如下——注意基础设施依赖于Core AND Web。 Web 保持隔离状态,只能访问核心业务逻辑。
【问题讨论】:
-
您选择并完成的最终设计是什么?有趣的是查看更新后的图表以及映射的一些类结构:)
-
问题:为什么依赖解析层对Web层有依赖? Controllers 不应该对 Dependency Resolution Layer 有依赖吗?
标签: asp.net-mvc architecture n-tier-architecture onion-architecture