我有以下真实世界的场景,为了这个例子稍微简化了
我有一个对象,我们称它为 Movie,它包含几个属性,例如
- 发布日期
- Actor (数组)
- 类型
- 评分
我需要一个可以输入新电影的表单,表单上包含以下元素:
- 日期日历
- 包含 Actor 的下拉列表
- 带有流派的下拉列表
- 带星标的评分字段
使用 asp.net mvc 组织我的代码的明确方法是什么,请概述位置
- 数据访问逻辑走
- 业务逻辑(验证等)
- 我想在这里使用 ViewModel 概念
到目前为止我有
- 电影模特
- MovieViewModel View 模型
- IMovieRepository接口(interface)
但我不清楚 Actor /流派数组如何适应这个以及我在哪里获取数据......它是否进入 IMovieRepository 接口(interface)?我是否为它创建另一个接口(interface),换句话说,我是否为 ViewModel 创建一个接口(interface)?我是否也创建了一个用于获取流派的界面? 另一个问题: 如何使用 ViewModel?我需要更改应用程序设置中的任何内容吗?
Controller Action 在它们的主体中有类似 View() 的东西....我如何将 ViewModel 传递到那里?我需要吗?
总而言之,我只想要一个简单的示例,说明您将如何实现上述场景。
我是 MVC 的新手,正在努力确保我的代码组织良好。
最佳答案
我记得迈克·科恩 (Mike Cohn) 说过关于敏捷的好话,“最佳实践不存在”
因此,您应该始终不断改进和重构,不仅要改进您的代码,还要改进和重构您的设计、架构、方法等,为此您需要以下内容:
- 将可维护性作为非功能需求放在所有工作的开头
- BDD(行为驱动开发)
- TDD(测试驱动设计)
- TDD(测试驱动开发)
- 具有适当代码覆盖率的单元测试
- 自动化您的构建部署和测试(所有重复事件的完全自动化)
我知道它的介绍有点长,但有必要了解我为什么我会建议您按照以下方法进行操作
我在MVC项目中的默认做法如下
- 展平使用映射层映射的 ViewModel 映射库
- 领域模型考虑 DDD 指令
- 将 Controller 作为服务工作的服务层 业务逻辑
- 服务层和工作单元使用的存储库
但正如我告诉过你的那样,最佳实践不存在所以我将使用 BDD 和 TDD 开始我的开发,为了实现这个我创建并创建了一个框架“DevMagicFake”,发布于CodePlex,这个框架将使我能够完成和完善我的观点并使其真正工作,而根本不需要任何下划线层的设计或代码
在该功能与涵盖其大部分行为的所有单元测试一起使用后,我将开始重构整个
- View 模型
- 绘图
- 服务
- 存储库
- 等等
并且对于每个重构,我都会运行所有需要的单元测试,以查明我的重构是否破坏了我的代码或破坏了应用程序的公认和已知行为,如果发生这种情况,我将修复任何破坏
例如,为了保存和检索客户,我将在每个操作方法中仅使用一行代码,如下所示
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”的项目
关于asp.net-mvc - 在 asp.net mvc 中组织真实世界的应用程序代码有点迷茫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8127144/