Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.net MVC:在哪里保存应用程序数据?_Asp.net Mvc_Singleton - Fatal编程技术网

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

Asp.net mvc ASP.net MVC:在哪里保存应用程序数据?,asp.net-mvc,singleton,Asp.net Mvc,Singleton,我刚刚开始将一个应用程序移植到ASP.net MVC,我有一个保存应用程序状态的对象(它跟踪机器上运行的某些进程,根据需要启动和停止,并发送/接收MSMQ消息) 我应该把这个东西放在哪里?在我当前的应用程序(基于HttpListener)中,它是一个单例,但是我知道单例会使测试变得困难。至少在MVC应用程序本身的上下文中,很难模拟或测试这个对象,而且它在应用程序之外有自己的测试集。但是,它可能需要被测试用的存根替换 该对象需要对多个控制器可用。我应该将此对象存储在何处,以及如何使其可供控制器使用

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

我应该把这个东西放在哪里?在我当前的应用程序(基于HttpListener)中,它是一个单例,但是我知道单例会使测试变得困难。至少在MVC应用程序本身的上下文中,很难模拟或测试这个对象,而且它在应用程序之外有自己的测试集。但是,它可能需要被测试用的存根替换

该对象需要对多个控制器可用。我应该将此对象存储在何处,以及如何使其可供控制器使用?在我所见过的ASP.net MVC示例中,我从未见过这样的案例

更新:

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

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

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


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

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

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


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

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


    然而,正如上面链接的页面所列,应用程序状态有几个缺点,所以在您继续使用之前,请确保这些问题不会影响您。通常,我避开应用程序状态,将应用程序数据存储在后端数据库中。因为您不想走这条路,所以应用程序状态可能对您没有问题。

    我无法将此应用程序数据保存在数据库中。这不是传统的数据库支持服务器-它使用MSMQ与计算机上的多个进程通信,需要启动和停止这些进程等。我在问题中对此进行了解释。抱歉,如果我不清楚,我将对此问题进行解释。感谢您的编辑,更清楚。在MVC应用程序中如何做到这一点?应用程序属性无法通过控制器访问,因为它在传统ASP.NET应用程序的代码隐藏中。请再说一遍,“如何在MVC应用程序中执行此操作?应用程序属性无法通过控制器访问,因为它在传统ASP.NET应用程序的代码隐藏中。”-在MVC应用程序的上下文中,当它显然不能回答所请求的问题时,为什么会将其标记为答案。System.Web.HttpContext.Current.application可在控制器中访问。