我刚开始将应用程序移植到ASP.net MVC并且我有一个持有应用程序状态的对象(它跟踪机器上运行的某些进程,必要时启动和停止以及发送/接收MSMQ消息)。
我应该在哪里保留这个物体?在我目前的应用程序(基于HttpListener)中,它是一个单例,但我知道单例使测试变得困难。模拟或测试这个对象是困难的,至少在MVC应用程序本身的上下文中,并且它无论如何都在应用程序之外拥有它自己的一组测试。但是,可能需要将其替换为存根以进行测试。
需要将对象提供给许多控制器。我应该在哪里存储此对象以及如何将其提供给控制器?我从来没有见过像我见过的任何ASP.net MVC例子中描述的这种情况。
更新:
我想我需要解释为什么我不能将这些数据存储在数据库中。首先,我必须解释应用程序的作用:
应用程序提供由多个“引擎”动态生成的图像,这些“引擎”是在服务器上运行的进程,通过MSMQ进行通信。让我调用对象我问的是关于EngineManager的问题。这个过程是这样的:
有几个控制器可以处理这些请求,每个控制器的工作略有不同。所有这些都需要与同一个EngineManager进行通信,因为在某些情况下它还需要同步对其他资源的访问。
正如您所看到的,它不是典型的数据库支持的Web服务器。
答案 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。