私のコントローラーは、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();
}
}
}
ただし、コントローラーは Dispose メソッドを仮想/オーバーライドとしてマークしていないため、これはコンパイルされません。だから今、私は立ち往生していると思います。メソッドを新規としてマークしても、フレームワークは Controller として型指定された参照を保持しないので、メソッドが呼び出されることはありませんか? これを回避する方法に関する提案はありますか?
アップデート
だから私はMVC3ソースを見て、これを見ました:
public void Dispose() {
Dispose(true /* disposing */);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
}
だから私は自分のコードを2番目の方法に入れるだけだと思います。ただし、この動作が契約で指定されているかどうかはわかりません。