给大家一个问题。
在我的公司,我们正在开发一个在 Microsoft 的 MVC 框架内运行的应用程序。我们正在实现的控制器类继承自MVC 基类 Controller。例子:
public class MyController: Controller
{
protected bool IsDisposed { get; set; }
… various methods…
}
我们在团队中的讨论围绕 Dispose() 模式展开。本质上,这涉及实现 IDisposable 接口,最好根据 Microsoft 认可的模式。
例如,请参阅此链接:http: //msdn.microsoft.com/en-us/library/fs2xkftw%28v=vs.110%29.aspx
有趣的是,我们的控制器类不拥有任何资源,无论是托管的还是托管的。这样一来,Dispose(bool) 的实现就大大简化了:
protected override void Dispose(bool disposing)
{
IsDisposed = true;
base.Dispose(disposing);
}
关于IsDisposed
属性的使用(或需要)存在一些分歧,用于以下方法:
protected void ThrowIfDisposed()
{
if (IsDisposed) throw new ObjectDisposedException(“MyController”);
}
然后在每个执行“实际”工作的方法开始时调用此方法。这里的想法是不应再次使用已处理的对象,因此它应该抛出 ObjectDisposedException。另一种观点是,由于Dispose(bool)
“什么都不做”(除了设置IsDisposed
属性和调用Dispose(bool)
基类),“已处理”对象并不是真正处于不可用状态,因此没有理由抛出。因此,甚至没有理由实施Dispose(bool)
.
反对这一点的一个论点是 MyController 应该在它被释放并调用它的一个方法时抛出,以便在将来的版本中添加托管和/或非托管资源时它的行为不会改变。
反对最后一点的论点是 MyController 不应该在将来的版本中添加任何资源,而是应该从将来需要添加资源的情况下派生出来。另一个问题是:为什么(库)类 Controller 不实现ThrowIfDisposed()
或类似的东西?
因此,总而言之,派系一想要实施Dispose(bool)
,ThrowIfDisposed()
如上所示,派系二认为它们是不必要的并且想要取消它们。
这两种观点我都看到了优点,我无法真正下定决心。意见?