我仍然大多不熟悉控制反转(尽管我现在正在了解它),所以如果这是我的问题的解决方案,请让我知道,我会得到回到了解它。ASP.NET MVC - 在控制器之间共享会话状态
我有一对控制器需要一个Session变量,自然没什么特别的事情发生,因为Session是如何工作的,但是这让我想知道在两个独立的控制器之间共享相关对象的最简单方法是。在我的特定场景中,我有一个UploadController和一个ProductController,它们可以相互协作来上传图像文件。当文件由UploadController上传时,关于上传的数据存储在Session中。发生这种情况后,我需要访问ProductController中的Session数据。如果我在两个控制器中为包含我的上传信息的Session变量创建get/set属性,我将能够访问该数据,但同时我会违反各种DRY,更不用说创建一个,充其量,混淆设计的地方是由两个完全断开的对象共享和修改对象。
你有什么建议?
精确语境:
文件上传查看帖子文件到UploadController.ImageWithpreview(),然后在发布文件并将其复制到一个临时目录中读取。保存文件后,另一个类会生成上传图像的缩略图。原始文件和生成的缩略图的路径然后返回一个JsonResult到一个javascript回调,它更新页面上可以“保存”或“取消”的表单中的一些动态内容。无论上传的图像是保存的还是跳过的,我都需要移动或删除它以及从临时目录中生成的缩略图。为了实现这一点,UploadController会跟踪会话维护的Queue对象中的所有上传文件及其缩略图。
返回视图:在窗体填充了上传的图像的生成缩略图后,表单回传到ProductsController,其中标识了所选文件(目前我将文件名存储在Hidden字段中,我意识到是一个可怕的漏洞),然后复制出临时目录到永久位置。理想情况下,我想简单地访问存储在会话中的队列,以便表单不需要像现在那样包含图像位置。这是我设想我的解决方案的方式,但我会热切地倾听任何评论或批评。
谢谢你的输入。如果有任何进一步的使用,我已经在原始问题中添加了更多信息。 – 2009-08-11 05:03:18
图像处理是实时的,但存在于网站的管理区域内,因此它的整体使用量非常小。在整个应用程序中,每小时最多只能处理几张图像。 我还考虑过的另一种方法是简单地让应用程序的Session_End事件删除当前会话的整个临时目录,但我不确定这是多么理想。 – 2009-08-11 05:28:09
如果您的用户上传了大量正在处理的图片,我认为您不能保证在会话到期时完成。一旦“处理”完成,我会删除它。只要队列中有要处理的项目,工作线程就应该保持活动状态,以便可以安全地进行处理。只要你的应用程序池不“睡”,你的系统应该继续处理好。很确定它在我链接的文章中有介绍。 – andymeadows 2009-08-11 05:56:23