38

我正在使用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

4

3 回答 3

28

您不希望基础架构依赖于 UI(Web)是正确的,但我有时会违反该规则。

我想用 Map() 方法创建 IMapper,而不是 IViewModelMapping。然后,接口可以具有可能与视图模型映射有关的实现,或者可能只是常规映射。无论哪种方式,该接口都可以在 Core 中,因为它在语义上没有绑定到任何类型的模型。

很棒的图形。我希望我回答了你的问题。Onion 架构的总体理念是让您的业务逻辑和模型保持在应用程序的中间(核心),并将您的依赖关系尽可能向外推。

于 2010-02-25T22:05:49.687 回答
0

尝试将对象映射移动到Web层。

于 2014-05-28T07:47:41.413 回答
0

您的 Web/UI 层可以依赖于基础设施层。但是,Web 对 Infrastructure 层的依赖并不是一个好的设计。Onion 架构表示将您的依赖项尽可能向外推。

您可以在 UI 中创建一个“\Builder”文件夹。在其中添加一个接口文件,例如.. IBuilder 或 IMapper 并在其中声明 ConvertToViewModel 或 CreateMapping 之类的方法。随你喜欢。

*Builder **IBuilder.cs - 在这里声明一个方法。**Builder.cs -- 在此处实现该方法,定义 ViewModel 与其对应的 DomainModel 之间的映射(来自核心层的引用)并在此处返回适当的 ViewModel。

于 2016-09-25T03:12:34.037 回答