2

我在这里这里对 ASP.NET MVC3 应用程序中的状态管理有一些疑问。其中一个答案提到,一个选项是简单地将每个步骤的状态存储在数据库中。

我想知道是否有人对通常如何实现这一点有任何建议,因为当我第一次向我建议时,我有一些想法。

无效的实体

考虑一个包含 3 个步骤的多步骤表单(向导)。我可以将每个步骤保存在数据库中以维护状态,但用户可以在该过程中途关闭 Web 应用程序,使我的数据库包含处于无效状态的实体。

为了克服这个问题,我可以在表中添加一个字段来指示向导是否已完成。任何不一致的项目都可以定期审查并在需要时自动删除,例如,如果在一天结束时在数据库中发现任何无效实体,它们将被自动删除。

这样做的问题是我必须向表中添加字段以存储有关应用程序的元数据。每个存储在多步骤表单中输入的信息的表都需要具有这些字段。这对我来说似乎是错误的。一种解决方案可能是创建一个特定的表来管理它,而不是用元数据污染每个实体表。

中介数据库

我想有一个位于我的应用程序和“真实”数据库之间的数据库。中间数据库将具有存储每个“步骤”的状态信息的表,并且只有当最后一步完成时,此信息才会传输到“真实”数据库(以及从中间删除的临时数据)。

这听起来也类似于 ASP.NET 已经提供的会话状态选项之一,所以我个人认为这会浪费时间。

在其他应用程序中使用(EG 桌面)

目前,我的应用程序是纯粹基于 Web 的,但我计划让桌面程序能够与同一个数据库进行交互。如果数据库有大量元数据被 Web 应用程序用于存储状态,我的桌面应用程序需要知道这一点以避免任何错误(IE 我的桌面应用程序需要知道它必须设置实体状态为“有效”,以便 Web 应用程序不会在一天结束时删除该实体,因为它认为它是无效的)。

概括

那么有没有人有关于如何最好地使用数据库来存储应用程序状态的任何信息或提示?

  • 数据库选项那么常见吗?
  • 它是否适合具有大量实体的大型应用程序?
  • 是否有任何性能影响?

编辑

为了清楚起见,我知道在 ASP.NET MVC 应用程序(TempData、缓存和会话)中管理状态存在其他选项,但我对有关使用数据库管理状态的信息特别感兴趣。

请不要对任何提到其他选项的人投反对票,因为我最初的问题可能对此并不清楚。

4

2 回答 2

1

为什么不在会话状态中存储数据?您只需要提出一种机制,允许您在会话状态中唯一标识和存储项目。

首先,您可以使用 InProc 会话状态模式。随着系统的增长,您可以考虑将会话状态存储在状态服务器或 SQL 服务器上。

于 2012-09-05T13:02:06.173 回答
0

这是一个很难回答的问题,但基本上,我会看到两条路线。

如果向导中给定步骤中的数据在逻辑上是正确的,并且满足您施加的所有约束,则可以将其写入“主”数据库。例如,如果您有一个管理订单的多步骤流程,并且第一步是创建一个客户记录(如果尚不存在),则在用户完成表单时将客户记录写入数据库。

这意味着如果用户离开、关闭浏览器或其他任何事情,当他们回来时数据就会在那里——这可能是他们所期望的。

如果给定步骤中的数据不连贯,不符合约束等,请使用会话状态来管理它,直到它准备好写入数据库。MVC 中的会话状态有点痛苦,你应该谨慎使用它——它使编写单元测试变得困难。

会话状态的目的是存储与用户会话相关的数据,但(尚未)打算进入数据库。

于 2012-09-05T13:40:38.510 回答