2

我有一个 .net 应用程序,其中有一个Form 层、一个DB 模型层(实体框架)和一个位于这两层之间的Controller 层

我需要处理这种情况:

  1. 用户按下一个按钮来编辑一些参数

  2. 表单需要请求一些代表这些参数当前状态的数据库数据

    • 可能,用户请求可能被拒绝,因为当前情况不适用,在这种情况下,应显示错误消息框
  3. 显示一个模态表单,用户更改参数并确认

  4. 在 DB 模型中进行了更改

这很简单。

事实是,在第 4 点,我们需要在第 2 点已经处理过的一些数据。

尤其是:

  • 在第 2 点,我们向 DB 模型请求一些数据,该数据可能不在缓存中,因此执行 SQL 查询
  • 该数据由本地 LINQ 处理
  • 返回以模态形式显示的几个复选框的状态

  • 在第 4 点,我们再次需要 LINQ 处理的数据

  • 由于我们来自表单层,我们不再拥有该数据
  • 因此再次向数据库模型请求数据,但这次它在缓存中
  • 该数据由本地 LINQ 再次处理

是否值得重新加载和重新处理数据以维护 MVC 模式?

4

2 回答 2

3

我不知道它在 VB.NET 中究竟是如何工作的,但是如果我们以纯粹的“MVC”方式(至少,我是如何理解的)来看待这个问题,那么有些事情是不对的。

  1. 在这一步中,当点击完成时,表单调用控制器(所有动作都由控制器传递)
  2. 然后控制器需要进行验证。如果它需要数据库来做到这一点,那就这样吧。然后,它将用户重定向到视图。(应该是消息框还是其他表单来输入数据)
  3. 在这里,用户在表单中进行更改,然后单击按钮提交。在此按钮中,您再次调用控制器(另一个功能/操作)。
  4. 在控制器中,您可以进行所需的验证并通过 LINQ 插入/更新数据库中的数据。然后,您可以重定向到视图。

由于第 2 步和第 4 步之间可能已经过去了很多时间,并且两次调用之间的数据可能已经改变,所以我认为执行 2 次请求是可以的。此外,由于它们是控制器中的 2 个不同功能,我认为您别无选择。

这就是我的看法,但我可能是错的:)

编辑

我不知道对数据库的查询很耗时而且这是一个问题。如果绝对目标是不让用户等待两次,因为时间在这个应用程序中很重要,我想你可以存储你的对象进入内存中的第 2 步,并使用控制器(使用某种辅助类)检索它。这就像在数据库中进行查询,但在内存中。如果您使用存储库模式,那么在控制器中编写逻辑代码的程序员甚至不会知道他正在查询数据库以外的其他内容,因为它是另一个抽象级别。您可以在第 4 步之后立即释放内存。

于 2013-03-11T15:49:23.797 回答
0

哦,我不是 100% 确定,但您问题中的流动模式看起来不正确?

通常的程序是显示数据并在数据视图中有一个编辑按钮

所以你可能有类似的东西

Function ShowAddressDetails(OwnerId as long) as ActionResult

而且您的 ActionResult 通常是一个模型,它可能会被传递给 VIEW(与地址记录示例保持一致)类似于...

Return View(AddressRecordModel)

使用 OwnerId 参数从 SQL DB 中提取地址记录

在您的 VIEW 中,您的 EDIT 按钮所在的位置,您至少有两个选择,即

1. Reload data from SQL (used where data may have changed since last action)
2. Pass the already loaded Model (Used where the data hasnt changed)

这意味着您拥有以下任一(或两者)

Function EditAddressDetails(OwnerId as long) as ActionResult

或者

Function EditAddressDetails(Model as AddressRecordModel) as ActionResult

或者,您可能有“CHILDACTION”而不是“ACTION”

也不要忘记以下... ?

最后,如果该序列仅由一个用户使用,则数据不应在请求之间更改,除非和 EDIT/AMEND/UPDATE 请求已成功完成。

于 2013-03-14T01:25:23.677 回答