2016-06-22 3 views
3

コントローラーをIDisposableに実装すると、DisposeメソッドがまだGCによって呼び出されないと想定します。だから、私は追加する必要があります意味:コントローラとIDisposable

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

protected override void Dispose(bool disposing) 
{ 
    if (!isDalDisposed) 
    { 
     isDalDisposed = true; 
     if (disposing) 
      DAL.Dispose(); 
    } 
    base.Dispose(disposing); 
} 

私はObject.Finalizeを使用して悪い習慣で、可能な限り避けるべきであることを読んだことがあります。

私の問題は、私の "サービス"がデフォルトのコンストラクタで作成され、usingステートメントを使用して各サービスの有効期間を制御することができないということです。では、この問題を解決する正しい方法は何でしょうか?

+0

ASP.NET MVCを使用していますか? –

+2

あなたはどんなコントローラーについて話していますか? WebAPIでは、コントローラは要求ごとにインスタンス化されるため、明示的に処理する必要はありません。 –

+0

ええ私はWeb APIのコントローラについて話しています。私は使い捨てのサービスをいくつか持っており、コンストラクタでそれらをインスタンス化します。完了したら処分する必要がありますが、私はそれが悪い習慣であると読んでいるので、ファイナライズアプローチを使用しない方法を見つけることを試みています。 – r3plica

答えて

6

Web APIのApiControllerはすでにIDisposableを実装しており、開発者がオーバーライドする便利な仮想メソッドを提供しています。これはDispose(bool)メソッドです。だからあなたがする必要があるのは、自分のブール値フラグを取り除き、disposingパラメータだけをチェックすることだけです。

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     DAL.Dispose(); 
    } 
    base.Dispose(disposing); 
} 
3

protected void Dispose(bool disposing)をオーバーライドすることができる場合は、基本クラスがDisposable patternを使用し、すでにIDisposableを実装していることを意味します。

IDisposableインターフェイスとpublic void Dispose()メソッドを削除するだけで問題ありません。

1

コンストラクタでサービスを作成する特別な理由はありますか?

コントローラは要求ごとにインスタンス化されるため、「使用」ブロック内のアクション自体でサービスを作成できます。サービスの存続期間は、アクションに限られています。

+0

そして、関連する可能性は、コントローラ・コンストラクタにサービス・ファクトリを注入し、アクション内で注入されたファクトリを使用してサービスを作成することです。注入されたファクトリ自体は 'IDisposable'を実装すべきではないので、処分する必要があることに注意してください。 (そうしたとしても、その処分は間違いなくインジェクタの責任となります)。 – DavidRR

関連する問題