![]() |
1
7
我也遇到了同样的问题。当代码对于操作方法来说太大时,我开始为每个操作创建类。是的,您将在类中进行一些数据检索,在控制器方法中进行一些数据检索。另一种选择是将所有的数据检索都放在类中,但是有一半的类是您真正不需要的,它们将是为了一致性而创建的,或者所有的数据检索都放在控制器方法中,但是同样,这些方法中的一些太复杂,需要被抽象成类…所以选择你的毒药。我宁愿有一点矛盾,并有正确的工作解决方案。 至于将行为放入ViewModel,我不这么认为,ViewModel的目的是成为一个用于设置和从视图中提取值的瘦类。 在某些情况下,我在ViewModel中放置了转换方法。例如,我需要将ViewModel转换为相应的实体,或者需要从实体加载带有数据的ViewModel。 要回答您的问题,我更喜欢在控制器/操作方法中从中检索数据。 通常,对于下拉列表,我创建一个下拉服务。下拉列表往往是跨视图的相同数据。通过服务中的下拉列表,我可以将它们用于其他视图和/或缓存它们。 根据布局,40多个字段可以创建杂乱的视图。根据数据的类型,我将尝试在多个视图中跨越多个字段,并使用某种选项卡或向导界面。 |
![]() |
2
3
还有更多;-)您可以在模型绑定器或动作过滤器中获取。第二种选择是在附近的某个地方查看吉米·博加德的博客。 here . 我个人用活页夹做的。我使用这样的视图模型: My custom ASP.NET MVC entity binding: is it a good solution? . 它由我的自定义模型活页夹处理:
您还可以看到在中执行存储库访问的模型绑定器示例。 S#arp Architecture . 至于视图模型中的静态数据,我仍在探索方法。例如,可以让视图模型记住实体而不是列表,以及 公共类MyViewModel { 公共myviewModel(订单,iemployeessvc svc) { }
} 您可以决定如何向ViewModel中注入\uSVC,但它基本上与控制器相同。请注意,ViewModel也是由MVC通过无参数构造函数创建的,因此您可以使用ServiceLocator或扩展MVC来创建ViewModel—例如,在自定义模型绑定器中。或者,您可以使用JimmyBogard的方法和AutoMapper,后者也支持IOC容器。 这里的常见方法是,每当我看到表示代码时,我都希望消除它。100个控制器操作执行域视图模型编组和存储库查找是一个坏情况。单模型绑定器以常规方式执行是一个很好的方法。 |
![]() |
3
3
我不会从您的ViewModel中的数据库中获取数据。视图模型的存在是为了促进关注点的分离(在视图和模型之间)。在那里纠缠持久性逻辑会破坏目标。 幸运的是,ASP.NET MVC框架为我们提供了更多的集成点,特别是ModelBinder。 我有一个通用ModelBinder的实现,它从服务层提取信息,地址为: http://www.iaingalloway.com/going-further-a-generic-servicelayer-modelbinder 它不使用ViewModel,但很容易修复。这绝不是唯一的实现。对于一个现实世界的项目,你最好使用一个不那么通用、更定制的解决方案。 如果你很勤奋,你的get方法甚至不需要知道服务层的存在。 解决方案可能类似于: 控制器动作方式:
ModelBinder:
VIEW模型:
构建服务层,并正常注册ModelBinder。 |
![]() |
4
1
另一个解决方案是: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspx 这里的要点:
就像这个模型:
您对视图的特定部分重复使用映射,并且不会编写任何新的代码行,因为部分视图模型已经有了映射。 如果您不想使用automapper,那么您有IViewModelMapper接口,然后您的IOC容器将帮助您的操作过滤器找到合适的
它还将向映射器提供任何所需的外部服务(这也可以通过automapper实现)。但是,当然automapper可以执行递归,无论如何,为什么还要编写额外的automapper;-) |
![]() |
5
0
考虑将服务传递到其构造函数上的自定义ViewModel(ala依赖项注入)。这将从控制器中删除模型填充代码,并使其能够专注于控制应用程序的逻辑流。自定义视图模型是提取下拉列表所依赖的选择列表等内容的理想场所。 在控制器中,许多用于检索数据的代码被认为不是最佳实践。控制器的主要职责是“控制”应用程序的流程。 |
![]() |
6
0
延迟提交此…赏金快结束了。但是… 要查看的另一个映射器是automapper: http://www.codeplex.com/AutoMapper 以及如何使用它的概述: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/01/22/automapper-the-object-object-mapper.aspx 我很喜欢它的语法。
现在,在您的控制器中,我将使用多个视图模型。这使得您可以在应用程序的其他地方重用这些视图模型,从而强制执行Dry。我不会将它们全部绑定到1个ViewModel。我将重构为:
我通常试图避免在控制器操作中保存多个实体。相反,我将重构Employee域对象,使其具有addSpouse()和saveSpouse()方法,这些方法将采用配偶的对象。这个概念被称为aggregateroots,控制根的所有依赖项,根是employee()对象。但是,那只是我。 |