我使用 ASP.NET MVC 4,我想加载大量数据并使其在我的所有类中都可以访问。
这是我的代码的简约示例:
public class MyController : Controller
{
public static List<MyObject> myList = null;
public ActionResult Index()
{
MyViewModel model = new MyViewModel();
myList = GetAllData(User.IDentity.Name); // Fill my list with 2k rows
model.List = myList;
return View(model);
}
public JsonResult GetData(int i)
{
return Json(myList.Where(x => x.Data == i));
}
}
一切都在本地工作,但当我在服务器上发布时,多个用户遇到一些问题(崩溃)。
我想我犯了一个错误。我确信这些静态数据存在内存泄漏。
我怎样才能避免这个问题?我应该使用单例吗?
控制器是无状态的,因此每次调用操作都会创建一个新的控制器实例,这将违背您想要实现的目的。也就是说,通过在构造函数中执行实例化静态的更好实现如下:
public MyController()
{
myList = GetAllData();
}
但是,我建议不要这样做,因为我认为问题更多的是您的设计中的缺陷或对控制器中如何处理状态的误解 - 它们是无状态的。
编辑:添加示例以解决评论:
常见的约定是执行以下操作:
1.消除静电,它确实没有给你带来任何好处。
Then:
public ActionResult Index()
{
MyViewModel model = new MyViewModel();
model.List = GetAllData(User.IDentity.Name);;
return View(model);
}
public JsonResult GetData(int i)
{
var model = GetAllData(User.IDentity.Name).Where(x => x.Data == i).ToList();
return Json(model);
}
您不需要静态,客户端对 Index 和 GetData 的调用永远不会在控制器的同一实例中执行,静态在这种情况下是无用的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)