我仍然大多与控制反转陌生的(虽然我现在正在学习这件事),所以如果这是解决我的问题,只是让我知道,我会回去学习一下吧。
我有一对需要会话变量控制器,自然没有什么太特殊了,因为会议是如何工作摆在首位发生,但是这让我想知道什么是干净的方法,以两个独立的控制器之间共享相关的对象。 在我的具体情况我有一个UploadController和ProductController的这一起工作,彼此上传的图像文件。 当文件被上传UploadController,对上传的数据存储在会话。 发生这种情况后我需要访问的ProductController的会话数据。 如果我创建了包含两个控制器我就可以访问这些数据我上传的信息会话变量的get / set属性,但在同一时间,我会违反各种干的,何况创建,在最好的,混乱的,其中的对象是由两个完全断开对象共享和修改的设计。
你有什么建议?
确切的语境:
文件上传查看帖子文件到UploadController.ImageWithpreview(),然后在发布文件并将其复制到一个临时目录中读取。 保存文件后,另一个类产生上传的图片的缩略图。 既原始文件和所生成的缩略图的路径,然后用JsonResult返回到JavaScript回调,其更新的形式在页面上的一些动态内容可以是“保存”或“取消”。 无论是上传的图片被保存或者被跳过,我需要移动或删除它和从临时目录生成的缩略图。 为了推动这项工作,UploadController跟踪所有上传的文件和它们的缩略图的会话保持队列对象的。
早在视图:表格填充了上传,形式回发到被选文件被标识ProductsController类图像的生成缩略图后(目前我保存在一个隐藏字段名,这是我知道的是一个可怕的漏洞),然后复制出临时目录的一个永久位置。 理想情况下,我想简单地访问我已经存储在会话中的队列,这样的形式并不需要包含图像位置,因为它现在。 这是我怎么也想象我的解决办法,但我会急切地听取任何意见或批评。
一对夫妇的解决方案浮现在脑海中。 你可以使用一个“SessionState的”类映射到请求和获取/设置信息本身(我从内存这样做,所以这是不可能的编译,是为了传达的点):
internal class SessionState
{
string ImageName
{
get { return HttpContext.Current.Session["ImageName"]; }
set { HttpContext.Current.Session["ImageName"] = value; }
}
}
然后从控制器,这样做:
var sessionState = new SessionState();
sessionState.ImageName = "xyz";
/* Or */
var imageName = sessionState.ImageName;
或者,您可以创建一个控制器扩展方法:
public static class SessionControllerExtensions
{
public static string GetImageName(this IController controller)
{
return HttpContext.Current.Session["ImageName"];
}
public static string SetImageName(this IController controller, string imageName)
{
HttpContext.Current.Session["ImageName"] = imageName;
}
}
然后从控制器:
this.SetImageName("xyz");
/* or */
var imageName = this.GetImageName();
这肯定是干的。 这就是说,我特别不喜欢这两种解决方案,因为我更喜欢作为存储数据很少,如果有的话,在会话。 但如果你的意图是要守住所有这些信息而无需加载/从其他来源识别它,这是最快的(肮脏)的方式我能想到的做到这一点。 我相当肯定有一个更好的解决方案,但我不知道所有的关于什么是你正在试图做的,什么问题域的信息。
请记住,在会话中存储信息的时候,你将不得不脱水/水化通过序列化对象,你可能不会得到你以为你是从做这样的表现。
希望这可以帮助。
编辑:在回答其他信息 ,你正在寻找部署这一点,但处理图像不知道“实时”是一个确保消防方式与DoS攻击击中。 我给你的建议如下 - 这是假设,这是面向公众的,任何人都可以上传图片:
1)允许用户上传的图像。 这个图像进入通过应用或一些服务后台处理的处理队列中。 此外,图像的名字进入用户的个人处理队列 - 可能是数据库中的表。 有关在Web应用程序的后台处理的信息可以发现@ 安排在托管Web服务器工作
2)过程中,这些图像和,而处理,显示一个“图形处理”。 你可以有一个检查被处理图像并改掉重载他们每X秒期间的产品页面上的Ajax请求。
3)当一个图像被“处理”,用户可以选择退出处理假设他们的上载的图像的一个。 这是可用的或者对产品页面(一个或多个),该显示图像上或在单独的“用户队列”视图,使它们以不考虑图像。
所以,你最终获得更多的领域对象和这些对象由队列管理。 我约定的坚决拥护者了配置,这样的产品形象(S)的最终目标应该是预定义的。 就像是:
图像/产品/ {ID} .jpg或,如果一个集合,图像/产品/ {ID} / {序列} .JPG。
然后,您并不需要知道在表单中的目的地。 这对所有图像都是相同的。
那么队列需要知道临时图像上传,什么产品ID了。 队列工人从队列弹出项目,对其进行处理,并相应地存储它们。
我知道这听起来比你原来打算多一点“结构化”,但我认为这是一个小清洁。
有没有在UploadController和ProductController的之间完全对等?
当文件被上传UploadController,对上传的数据存储在会话。 发生这种情况后我需要访问的ProductController的会话数据。
当我读到,UploadControl需要读写访问上传数据时,需要ProductController的只读。
如果这是真的,那么你可以把它明确通过围绕上载信息的immuatable包装,并有UploadController它放入会话。
会议本身是definiton公共共享布告,以允许任何人获得,并把成本解耦明确的关系。 你可以让ProductController的了解的UploadController,因此不需要用通过会话传递上传信息。 我的直觉是,上传的信息有趣的是公众,所以使用Session是合理的。
我看不出有任何违反DRY这里,我们明确地试图分开的责任。