MVC SelectListItem在多层设计中

时间:2014-06-11 10:30:23

标签: asp.net-mvc architecture domain-driven-design

我遵循典型的域驱动设计层设计。我有:

网络

  • 包含视图和控制器

ApplicationService

  • 应用程序的外观,即服务

  • 包含视图模型

  • AutoMapper

域模型

  • BLL

存储库

  • 持久性逻辑

但是由于我在我的视图中使用下拉列表,我很困惑如何在此设计中合并SelectListItem。请注意,下拉列表中填充了数据库中的数据。

根据我的阅读,View Models应该驻留在ApplicationService层中。 好的理论,因为只有网络层"演示",即视图和控制器,因此可以轻松替换而无需重新设计应用程序。

但是,当View Models使用SelectListItem(用于下拉列表)时,这不起作用。 SelectListItem需要System.Web.Mvc。而且我认为ApplicationService层不应该引用System.Web.Mvc。

所以,我被卡住了!

我向ApplicationService层提供对System.Web.Mvc(丑陋选项)的引用。

或者我找到了一种如何在没有SelectListItem的情况下填充下拉列表的方法。

或者我将View Models移回Web层,这违背了设计。

在Web图层中添加另一个AutoMapper和相关逻辑。

那么,其他人如何在多层设计中实现下拉列表逻辑?

2 个答案:

答案 0 :(得分:1)

应用程序服务不应该处理ViewModel。 ViewModel是一个表示层概念(因此名称)。它包含为显示量身定制的内容,您不希望它泄漏到应用程序空间中。

依赖关系应该始终从外部到内部,因此ViewModel应该依赖于(由/映射)应用程序服务公开的任何数据结构,而不是相反。

请参阅Should a service layer return view models for an MVC application?

答案 1 :(得分:0)

创建了一个类DropDownListItem,与SelectListItem相同,即属性Selected,Text,Value。

View模型使用DropDownListItem,我以前使用过SelectListItem。

View将DropDownListItems转换为SelectListItems以供使用的下拉列表。