【问题标题】:A bit lost with organizing real world application code in asp.net mvc在 asp.net mvc 中组织真实世界的应用程序代码有点迷失
【发布时间】:2011-12-28 22:54:02
【问题描述】:

我有以下真实世界的场景,为了这个例子,有些简化

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

  • 发布日期
  • 演员(数组)
  • 类型
  • 评分

我需要有一个可以输入新电影的表单,表单上包含以下元素:

  • 日期日历
  • 演员下拉列表
  • 按流派下拉列表
  • 带有星星的评分字段

使用 asp.net mvc 组织我的代码的清晰简洁的方法是什么,请概述在哪里

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

到现在为止

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

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

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

总而言之,我只是想要一个简单的例子来说明你将如何实现上述场景。

我是 MVC 新手,正在努力确保我的代码组织良好。

【问题讨论】:

  • 您的 GUI 似乎与您的业务逻辑相矛盾。您说一部电影有多个演员,但您在 GUI 中提供了一个下拉列表,显然允许选择单个演员。同样代表收视率。似乎很奇怪。您的意思是多选下拉列表吗?
  • 不,当一个演员被选中时,它会自动添加并显示在下拉列表上方的屏幕上,旁边有“x”(用于删除)。用户可以以这种方式选择几个动作。我很可能会为此使用 jquery ajax。用户只能对电影评分一次 - 我将编辑我的问题。
  • sharparchitecture.net。它为 asp.net mvc 应用程序提供了一个可靠的架构(使用最佳实践)。

标签: asp.net-mvc code-organization


【解决方案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);

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

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

这将使我意识到如何进行设计、开发架构并使我相信我的代码确实可以高质量地工作并符合客户的期望

最后,只有一句话,我总是不断地重构和重构,每一个新特性、修改、问题或问题发生在我身上,都可能导致新的架构概念或设计决策,从而改变整个应用程序,我我随时为他们做好准备。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2011-04-14
    相关资源
    最近更新 更多