2009-04-30 24 views
3

我剛剛開始將應用程序移植到ASP.net MVC,並且我有一個對象持有應用程序狀態(它跟蹤在機器上運行的某些進程,根據需要啓動和停止以及發送/接收MSMQ消息)。ASP.net MVC:應用程序數據在哪裏?

我該在哪裏保持這個對象?在我目前的應用程序中(基於HttpListener),它是一個單例,但是我知道單例會讓測試變得困難。至少在MVC應用程序本身的情況下,嘲笑或測試這個對象是很困難的,它本身也有自己的一套測試。但是它可能需要替換爲測試存根。

該對象需要提供給多個控制器。我應該在哪裏存儲這個對象,我應該如何讓控制器可用?我從來沒有見過像我見過的任何ASP.net MVC示例中描述的情況。

UPDATE:

我想我需要解釋爲什麼我不能在此數據存儲在數據庫中。首先,我必須解釋應用程序的功能:

該應用程序提供由許多「引擎」動態生成的圖像,這些引擎是服務器上運行的進程,通過MSMQ進行通信。讓我們來調用這個對象,我正在問關於EngineManager的問題。過程如下所示:

  1. 客戶端向服務器POST一個XML請求,給出要使用的「引擎」的名稱,以及描述圖像的許多參數。
  2. 應用程序檢查EngineManager以查看該引擎是否正在運行。如果沒有,它會啓動它。
  3. 應用程序將MSMQ消息發送到引擎並等待響應。
  4. 應用程序將生成的圖像發送回客戶端。
  5. 如果在任何時候引擎關閉或崩潰,應用程序必須意識到這一點,以便它可以在對該引擎的下一個請求中重新啓動。
  6. 當應用程序關閉時,所有引擎也關閉。

有幾個控制器可以處理這些請求,每個控制器做一個稍微不同的工作。它們都需要與同一個EngineManager進行通信,因爲它在某些情況下也需要同步對其他資源的訪問。

正如您所看到的,它不是典型的數據庫支持的網絡服務器。

+0

感謝編輯,更清晰。 – 2009-04-30 10:44:39

回答

1

如果您希望此對象可供所有用戶使用,即它不是特別的會話,你可以看看它存儲在應用程序狀態:

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

然而,應用程序的狀態有一些缺點,如上面列出的鏈接頁面上,所以一定要確保這些問題不影響你在走下那條路線之前。一般來說,我會從Applciation狀態中清除並將應用程序數據存儲在後端數據庫中。因爲你不想走這條路線,應用程序狀態可能會適合你。

-3

將您的應用程序數據保存在數據庫中,並通過模型層訪問此數據。客戶端僅保留會話標識。

+0

我無法將此應用程序數據保存在數據庫中。這不是傳統的數據庫支持的服務器 - 它使用MSMQ與機器上的許多進程通信,並需要啓動和停止這些進程等。我在問題中解釋了這一點。 – Grokys 2009-04-30 10:15:33

+0

對不起,如果我不清楚,我會添加一個解釋的問題。 – Grokys 2009-04-30 10:26:39

2

您應該將對象傳遞給每個Controller實例的構造函數,並且控制器操作方法應該全部使用傳遞給Controller實例構造函數的對象實例。

ASP.NET MVC附帶的默認ControllerFactory不允許你這樣做。但是,有免費的插件框架(我喜歡的是Autofac),它允許這種編程風格。

相關問題