【发布时间】:2012-05-24 04:14:32
【问题描述】:
我的控制器继承自一个包含实现 IDisposable 的字段的类。所以我的第一直觉是写:
public abstract class EventRepositoryControllerBase : Controller
{
protected EventRepository eventRepos { get; private set; }
public EventRepositoryControllerBase(EventRepository eventRepos)
{
this.eventRepos = eventRepos;
}
public override void Dispose()
{
try
{
base.Dispose();
}
finally
{
eventRepos.Dispose();
}
}
}
但这不会编译,因为 Controller 没有将 Dispose 方法标记为虚拟/覆盖。所以现在我想我被困住了。即使我将我的方法标记为新方法,框架是否不会保存类型为 Controller 的引用,因此我的方法将永远不会被调用?有关如何解决此问题的建议?
更新
于是我查看了 MVC3 源码,看到了这个:
public void Dispose() {
Dispose(true /* disposing */);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
}
所以我想我会把我的代码放在第二种方法中。但不确定这种行为是否是合同规定的。
【问题讨论】:
-
无论如何你都不应该在控制器中处理
eventRepos。EventRepositoryControllerBase没有创建它,所以它不应该杀死它。构造函数的实现方式表明eventRepos的生命周期超出了EventRepositoryControllerBase的生命周期
标签: c# asp.net-mvc asp.net-mvc-3 model-view-controller idisposable