我在ASP.NET MVC3应用程序中有一些问题here和here状态管理。其中一个答案提到,为此选项只是简单地存储数据库中每个步骤的状态。
我想知道是否有人对这通常是如何实现有任何建议,因为当我第一次向我建议时,我有一些想法。
无效的实体
考虑一个包含3个步骤的多步骤表单(向导)。我可以保存数据库中的每个步骤以维护状态,但是用户可以在流程的中途关闭Web应用程序,使我的数据库包含处于无效状态的实体。
为了解决这个问题,我可以在表格中添加一个字段,指示向导是否已完成。任何不一致的项目都可以定期审核,并在需要时自动删除,例如:如果在一天结束时在数据库中找到任何无效实体,它们将被自动删除。
这个问题是我必须在表中添加字段来存储有关应用程序的元数据。存储以多步骤形式输入的信息的每个表都需要具有这些字段。这对我来说似乎不对。一种解决方案可能是创建一个特定的表来管理它,而不是用元数据污染每个实体表。
中介数据库
我想到了一个位于我的应用程序和“真正的”数据库之间的数据库。 中间数据库将具有存储每个“步骤”的状态信息的表,并且仅当最后一步完成时,该信息才会被转移到“真实”数据库(以及从中间人删除的临时数据)。
这听起来类似于ASP.NET提供的会话状态选项之一,我个人认为这会浪费时间。
在其他应用程序中使用(E.G. Desktop)
此时我的应用程序纯粹是基于Web的,但我计划让桌面程序可以与同一个数据库进行交互。如果数据库有大量元数据用于Web应用程序用于存储状态,我的桌面应用程序需要注意这一点以避免任何错误(IE我的桌面应用程序需要知道它必须设置实体状态为“有效”,以便Web应用程序在一天结束时不会删除该实体,因为它认为它是无效的。)
摘要
那么有没有人有关于如何最好地使用数据库存储应用程序状态的任何信息或提示?
修改
为了清楚起见,我知道在ASP.NET MVC应用程序(TempData,缓存和会话)中管理状态存在其他选项,但我对使用数据库管理状态的信息特别感兴趣。
请不要对提及其他选项的任何人进行投票,因为我的原始问题可能不清楚。
答案 0 :(得分:1)
为什么不将数据存储在会话状态中?您只需要提供一种机制,允许您在会话状态中唯一标识和存储项目。
首先,您可以使用InProc会话状态模式。随着系统的发展,您可以考虑在状态服务器或SQL服务器上存储会话状态。
答案 1 :(得分:0)
这是一个很难回答的问题,但基本上,我会看到两条路线。
如果向导中给定步骤中的数据在逻辑上是正确的,并且满足您施加的所有约束,则可以将其写入“主”数据库。例如,如果您有一个用于管理订单的多步骤流程,而第一步是创建客户记录(如果尚未存在),则在用户完成表单时将客户记录写入数据库。
这意味着如果用户离开,关闭浏览器或其他什么,数据将在他们回来时出现 - 这可能是他们所期望的。
如果给定步骤中的数据不一致,不符合约束等,则使用会话状态对其进行管理,直到它准备好写入数据库为止。 MVC中的会话状态为a bit of a pain,您应该谨慎使用它 - 这使得编写单元测试变得困难。
会话状态的目的是存储与用户会话相关的数据,但是(尚未)打算进入数据库。