ASP.net MVC:在哪里保存应用程序数据?

时间:2009-04-30 09:46:08

标签: asp.net-mvc singleton

我刚开始将应用程序移植到ASP.net MVC并且我有一个持有应用程序状态的对象(它跟踪机器上运行的某些进程,必要时启动和停止以及发送/接收MSMQ消息)。

我应该在哪里保留这个物体?在我目前的应用程序(基于HttpListener)中,它是一个单例,但我知道单例使测试变得困难。模拟或测试这个对象是困难的,至少在MVC应用程序本身的上下文中,并且它无论如何都在应用程序之外拥有它自己的一组测试。但是,可能需要将其替换为存根以进行测试。

需要将对象提供给许多控制器。我应该在哪里存储此对象以及如何将其提供给控制器?我从来没有见过像我见过的任何ASP.net MVC例子中描述的这种情况。

更新:

我想我需要解释为什么我不能将这些数据存储在数据库中。首先,我必须解释应用程序的作用:

应用程序提供由多个“引擎”动态生成的图像,这些“引擎”是在服务器上运行的进程,通过MSMQ进行通信。让我调用对象我问的是关于EngineManager的问题。这个过程是这样的:

  1. 客户端向服务器发送XML请求,给出要使用的“引擎”名称,以及描述图像的许多参数。
  2. 应用程序检查EngineManager以查看该引擎是否正在运行。如果没有,它就会启动它。
  3. 应用程序将MSMQ消息发布到引擎并等待响应。
  4. 应用程序将生成的图像发送回客户端。
  5. 如果引擎在任何时候关闭或崩溃,应用程序必须知道这一点,以便可以在下次请求该引擎时重新启动它。
  6. 当应用程序关闭时,所有引擎也会关闭。
  7. 有几个控制器可以处理这些请求,每个控制器的工作略有不同。所有这些都需要与同一个EngineManager进行通信,因为在某些情况下它还需要同步对其他资源的访问。

    正如您所看到的,它不是典型的数据库支持的Web服务器。

3 个答案:

答案 0 :(得分:2)

您应该将对象传递给每个Controller实例的构造函数,并且控制器操作方法应该都使用传递给Controller实例构造函数的对象实例。

ASP.NET MVC附带的默认ControllerFactory将不允许您这样做。但是,有免费的插件框架(我喜欢的是Autofac)允许这种编程风格。

答案 1 :(得分:1)

如果您希望所有用户都可以使用此对象,即它不是特定于会话的,您可以查看将其存储在应用程序状态:

http://msdn.microsoft.com/en-us/library/bf9xhdz4(VS.71).aspx

但是,应用程序状态有几个缺点,如上面链接的页面上所列,因此请确保在您沿着该路线前进之前这些问题不会对您产生影响。通常,我从Applciation状态转出,并将应用程序数据存储在后端DB中。由于您不想沿着这条路线走下去,申请状态对您来说可能没问题。

答案 2 :(得分:-4)

将您的应用程序数据保存在数据库中,并通过模型层访问它。客户端仅保留会话ID。