我有以下真实世界的场景,为了这个示例的缘故,有些简化
我有一个对象,命名为Movie它将由几个属性组成,比如
- 发布日期
- 演员(数组)
- 类型 评级>
我需要能够有一个可以输入新电影的表单,表单上有以下元素:
- 日历日期
- 下拉列表与演员
- 组下列表与类型
- 星级评定字段
使用asp.net mvc组织我的代码,请概述
- 数据访问逻辑失效
- 业务逻辑运行(验证等)
- 我想在这里使用ViewModel概念
目前我有
- 电影模型
- MovieViewModel视图模型 <
- IMovieRepository接口/gh>
但我不清楚演员/类型数组如何适合这个,我在哪里为它获取数据....它会进入IMovieRepository接口吗?我要为它创建另一个接口吗,换句话说,我要为ViewModel创建一个接口吗?我是否也需要创建一个获取类型的界面?另一个问题:我如何使用ViewModels?我需要更改应用程序设置中的任何内容吗?
控制器动作在它们的主体中有类似View()的东西....我怎么传递ViewModel呢?我需要吗?
总之,我只想要一个简单的例子来说明如何实现上面的场景。
我是MVC的新手,并试图确保我的代码组织良好。
我记得Mike Cohn关于敏捷的非常好的一句话,"最佳实践是不存在的"
所以你应该不断地改进和重构你的代码,也要为你的设计、架构、方法等。要做到这一点,你需要以下几点:
- 把可维护性作为你所有工作的首要要求 行为驱动开发(BDD)TDD(测试驱动设计)TDD(测试驱动开发)
- 适当代码覆盖率的单元测试
- 自动化构建部署和测试(所有重复活动的完全自动化)
我知道这是一个有点长的介绍,但有必要理解我为什么我会建议你按照下面的方法来做
我在MVC项目中的默认方法如下
- Flatten使用映射层映射的ViewModel映射库
- 领域模型考虑DDD指令
- 服务层,将控制器作为服务使用业务逻辑
- 服务层和工作单元使用的存储库
但是正如我告诉你的,最佳实践是不存在的所以我将使用BDD和TDD开始我的开发,为了实现这一点,我创建了一个框架"DevMagicFake",发布在CodePlex上,这个框架将使我能够完成和完成我的视图,并使它真正的工作没有任何设计或代码的下划线层在所有
当所有的单元测试覆盖了大部分的行为之后,我将开始重构整个
- ViewModel <
- 映射/gh>
- <
- 库/gh>
- 等。
对于每次重构,我都运行所有需要的单元测试,以确定我的重构是否破坏了我的代码或破坏了应用程序的公认和已知行为,如果发生了,我会修复任何破坏
因此,例如,要保存一个Customer并检索它,我将在每个操作方法中只使用一行代码,如下所示
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等的决定
- 完成功能并作为客户或业务专家工作将
- 我有涵盖所有功能行为和响应的单元测试
这将使我意识到如何设计,开发架构,并使我有信心,我的代码确实以高质量和客户期望的方式工作
最后,只有一个词,我总是保持重构和重构,每一个新的特性,修改,问题或问题发生在我身上,它可能导致新的架构概念或设计决策,将改变整个应用程序,我总是准备好了。
顺便说一下,你可以下载MVC3项目,使用我的方法从DevMagicFake在CodePlex上,你会发现项目名为"TryFakeMVC3"