在asp.net mvc中组织真实应用程序代码有点丢失

时间:2011-11-14 19:45:10

标签: asp.net-mvc code-organization

我有以下真实场景,为了这个例子而稍微简化了

我有一个对象,我们称之为Movie,它将由几个属性组成,例如

  • 发布日期
  • 演员(阵列)
  • 类型
  • 评级

我需要能够有一个可以输入新电影的表格,表格上有以下元素:

  • 日期日历
  • 带演员的下拉列表
  • 带有流派的下载列表
  • 有明星的评级字段

使用asp.net mvc组织我的代码有一个明确的方法,请概述

  • 数据访问逻辑
  • 业务逻辑(验证等)
  • 我想在这里使用ViewModel概念

到目前为止我已经

  • 电影模特
  • MovieViewModel视图模型
  • IMovieRepository接口

但我不清楚actor / genres数组如何适应这个以及我在哪里获取它的数据....它是否进入IMovieRepository接口?我是否为它创建了另一个界面,换句话说,我是否为ViewModel创建了一个界面?我是否也创建了一个用于获取类型的界面? 另一个问题: 我如何使用ViewModels?我是否需要更改应用程序设置中的任何内容?

控制器动作在它们的身体中有类似View()......我如何在那里传递ViewModel?我需要吗?

总而言之,我只想了解一个如何实现上述方案的简单示例。

我是MVC的新手,并试图确保我的代码组织良好。

1 个答案:

答案 0 :(得分:-1)

我记得Mike Cohn关于敏捷的非常好的话,“最佳实践不存在

因此,您应该始终不断改进和重构您的代码,还要考虑您的设计,架构,方法等,并且要做到这一点您将需要以下内容:

  • 在所有工作的开始时将可维护性作为非功能要求
  • BDD(行为驱动开发)
  • TDD(测试驱动设计)
  • TDD(测试驱动开发)
  • 具有适当代码覆盖百分比的单元测试
  • 自动构建部署和测试(所有重复活动的完全自动化)

我知道它有点长的介绍,但有必要了解我为什么我会建议你按照以下方式做我的方法

我在MVC项目中的默认方法如下

  • 展平使用映射图层映射的ViewModel 映射库
  • 域模型考虑DDD指令
  • 使用控制器作为服务的服务层 业务逻辑
  • 服务层和工作单元使用的存储库

但正如我告诉你的那样,最佳实践并不存在所以我将使用BDD和TDD开始我的开发,并实现这个我的创始人并创建一个框架“DevMagicFake”发布在CodePlex上,这个框架将使我能够完成并完成我的视图并使其真正有效,而无需任何设计或代码用于下划线层

在该功能正在处理涵盖其大部分行为的所有单元测试之后,我将开始重构整个

  • 视图模型
  • 映射
  • 服务
  • 存储库

对于每个重构,我运行所有需要的单元测试,以查找我的重构是否破坏了我的代码或破坏了应用程序的已接受和已知行为,如果它发生,我将修复任何中断

因此,例如,为了保存客户并检索它,我将在每个操作方法中仅使用一行代码,如下所示

public ActionResult List(CustomerVeiwModel customerVeiwModel)
    {    
       var repository = new FakeRepository<CustomerVeiwModel >();
       repository.Save(customerVeiwModel);

要检索客户,我只需要编写以下代码:

var repository = new FakeRepository<CustomerVeiwModel>();
var  customer = repository.GetById(1);

所以我总是在2点之后做出ViewModel,Repository,Architecture等的决定

  • 功能已完成并作为客户或业务专家工作 预期
  • 我有单元测试,涵盖所有功能行为和响应

这将让我意识到如何处理设计,开发架构并让我相信我的代码真正以高质量和客户期望的方式工作

最后,只有一个词,我总是保持重构和重构,每一个新功能,修改,问题或问题都发生在我身上,它可能会导致新的架构概念或设计决策,这将改变整个应用程序和我我总是为他们做好准备。

顺便说一下,你可以在CodePlex上下载使用我的方法形式DevMagicFake的MVC3项目,你会发现名为“ TryFakeMVC3 ”的项目