C# 当控制器的字段实现IDisposable时,如何处置控制器?
我的控制器继承自一个类,该类包含一个实现IDisposable的字段。所以我的第一反应是写:C# 当控制器的字段实现IDisposable时,如何处置控制器?,c#,asp.net-mvc,asp.net-mvc-3,model-view-controller,idisposable,C#,Asp.net Mvc,Asp.net Mvc 3,Model View Controller,Idisposable,我的控制器继承自一个类,该类包含一个实现IDisposable的字段。所以我的第一反应是写: public abstract class EventRepositoryControllerBase : Controller { protected EventRepository eventRepos { get; private set; } public EventRepositoryControllerBase(EventRepository eventRepos)
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();
}
}
}
但这不会编译,因为控制器不会将Dispose方法标记为virtual/override。所以现在我想我被卡住了。即使我将我的方法标记为new,框架是否会保存类型为Controller的引用,因此我的方法永远不会被调用?关于如何解决这一问题的建议
更新
因此,我查看了MVC3源代码,并看到了以下内容:
public void Dispose() {
Dispose(true /* disposing */);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
}
所以我想我将把我的代码放在第二个方法中。但不确定此行为是否按合同指定。ASP.NET MVC中的控制器类已正确实现IDisposable接口。如需进一步参考,请查看MSDN页面上的详细说明
要插入IDisposable接口,您需要重写已找到的受保护的dispose方法,并将用于处理“您自己的”类的逻辑放在那里。ASP.NET MVC中的控制器类已正确实现IDisposable接口。如需进一步参考,请查看MSDN页面上的详细说明 要插入idisposable接口,您需要重写已找到的受保护的dispose方法,并将用于处理“您自己的”类的逻辑放在那里。1)在当前类上实现接口idisposable,并执行您想要执行的操作 2) 在基类中实现该接口,然后在此类中重写它 3) 只在基类中实现该接口,不要重写 另外,您的代码看起来很奇怪,您有一个抽象类,并且您提供了实现逻辑1)在当前类上实现接口idisposable,并执行您想要执行的操作 2) 在基类中实现该接口,然后在此类中重写它 3) 只在基类中实现该接口,不要重写
另外,你的代码看起来很奇怪,你有一个抽象类,你提供了实现逻辑,如果
IDisposable.Dispose
是用一个未密封的方法实现的,那么派生类型的代码将在基类型清理代码前后运行;由于GC.SuppressFinalize
在派生类型完成清理(包括可能在基类型完成清理后发生的任何部分)之前不应被调用,GC.SuppressFinalize
是在一个密封的实现中生成的,该实现反过来调用一个签名为void Dispose(bool)
的虚拟方法
请注意,从概念上讲,在密封包装中调用虚拟方法是一个好主意,但Microsoft的实现中存在一些缺陷。最值得注意的是:
早在Microsoft找到处理非托管资源的最佳方法之前,
Dispose
模式就是一个很好的尝试。今天,我认为最好将虚拟方法的参数视为用于更改签名的虚拟参数,而不是有意义的东西(即使在从包装器链接虚拟方法时,应该始终传递True
。如果IDisposable.Dispose
是使用未密封的方法实现的,然后派生类型的代码将在基类型清理代码之前和之后运行;由于GC.SuppressFinalize
在派生类型完成清理(包括可能在基类型完成清理后发生的任何部分)之前不应被调用,GC.SuppressFinalize
是在一个密封的实现中生成的,该实现反过来调用一个签名为void Dispose(bool)
的虚拟方法
请注意,从概念上讲,在密封包装中调用虚拟方法是一个好主意,但Microsoft的实现中存在一些缺陷。最值得注意的是: