C# 如果您的ViewModel是IDisposable的,MVC会调用Dispose吗?
假设您无法控制对象的创建和处理。在某些情况下,你不会 以MVC为例。假设你有这样的东西:C# 如果您的ViewModel是IDisposable的,MVC会调用Dispose吗?,c#,.net,asp.net-mvc,idisposable,C#,.net,Asp.net Mvc,Idisposable,假设您无法控制对象的创建和处理。在某些情况下,你不会 以MVC为例。假设你有这样的东西: interface IFoo : IDisposable { } class HomeController { private IFoo _foo = null; HomeController(IFoo foo) { _foo = foo; } ActionResult Index() { return View(_foo
interface IFoo : IDisposable { }
class HomeController
{
private IFoo _foo = null;
HomeController(IFoo foo)
{
_foo = foo;
}
ActionResult Index()
{
return View(_foo);
}
}
一旦您的对象被传递到视图,您就几乎失去了对它的控制
在这种情况下,我只能想到两种方法来缓解这种情况:
1) 如果疼,就不要做。换句话说,不要让您提供给视图的内容成为可识别的
2) 或者,与1相同,但是如果您确实收到了一个IDisposable
,并且希望将其传递给视图,则不要这样传递IDisposable
。即使涉及到所有数据的副本,也可以将其强制转换为不可IDisposable
的内容,并自己调用Dispose()
。例如,像这样:
ActionResult Index()
{
using(_foo)
{
return View((FooViewModel)_foo);
}
}
但我很好奇。MVC是否检查IDisposable,并在完成视图渲染后,在视图接收到的任何状态下调用它?因此,这里有几点。简短回答:不,MVC不会对存储在字段中的视图模型调用Dispose 更长的回答:根据您在此处列出的内容,可能是 我假设您正在使用某种依赖注入框架,如autofac、structuremap等,那么容器将跟踪该实例。我不知道每个框架的复杂性,但我假设它们中的许多确实在请求结束时对实现
IDisposable
的类型调用dispose(autofac肯定会这样做)
最后,您只需要测试它是否是,然后从那里开始。ASP.NET MVC
控制器类已经实现了IDisposable
。如果在请求执行后需要进行进一步清理,则可以重写Dispose
方法。在您的示例中,它看起来像:
public class HomeController
{
private IFoo _foo = null;
// Your code as usual
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if(disposing && _foo != null)
_foo.Dispose();
}
}
非常感谢。对我希望和Unity一起去。我知道有一个ContainerLifeTimeManager或类似的对象控制对象的生命周期,但我不知道具体细节。所以,我想你的答案是正确的。在我标记之前6分钟。您的模型不会自动被丢弃,但在原始答案中,您可以通过覆盖控制器的Dispose()
方法来清理。对不起,@Darren。你的回答非常正确,非常有帮助,并且开辟了另一个话题。但我现在倾向于投票支持贾斯汀的答案,因为这是一个非常棒的话题。哦,当然。现在你只是让你所有的朋友来投票支持你-走开,贾斯汀,这是我的问题p:-)还有4分钟!顺便说一句,justin是正确的,因为您可以在每个控制器中手动执行此操作,但我仍然建议让您的ioc框架执行此操作(出于各种原因)。无论哪种方法都能完成任务,所以选择最适合你的方法。@DarrenKopp。这真是你们两个之间的一条纽带。我很感激这两个答案。我非常喜欢他们两个,我希望两个都能做到。唉!:-)我同意@DarrenKopp,因为HomeController
没有专用的\u foo,但是\u foo是使用构造函数注入的。这意味着实例(_foo)可以在其他实例中使用。所以我认为HomeController不应该处理。。。