web-dev-qa-db-ja.com

Dispose()およびNinjectのガイドライン

したがって、WCFサービスから公開されているメソッドがあります。

public GetAllCommentsResponse GetAllComments(GetAllCommentsRequest request)
{
    var response = new GetAllCommentsResponse();

    using(_unitOfWork)
        try
        {
            Guard.ArgNotNull(request, "request");

            var results = _unitOfWork.CommentRepository.Get(d => d.Id > 0).ToArray();

            //... Do rest of stuff here
        }
        catch (Exception ex)
        {
            response.Success = false;
            response.FailureInformation = ex.Message;
            Logger.LogError("GetAllComments Method Failed", ex);
        }

    return response;
}

グローバルDataUnitOfWorkオブジェクト(IDisposableを実装)があり、サービス呼び出しが着信したときにコンストラクター引数を介してNinjectによってインスタンス化されます。デバッグ時に使用する場合

using(_unitOfWork)

_unitOfWorkオブジェクトは、スコープから外れた直後に破棄され、Ninjectによって再度呼び出されます(ただし、破棄済みとしてマークされているため、何も起こりません)。usingステートメントがないと、Ninjectが破棄を処理します。

簡単に言えば、これには一般的な経験則がありますか?私が読んだすべてのものがそれを決して使用しない、または特定の折衷的な状況でそれを使用することを示しているように見えた後、私はIDisposable全体を怖がっていましたが、それはいつも私を混乱させます。

どんな入力でも大歓迎です。

ああ、とにかくここで入力している間も、破棄するときにGC.SuppressFinalize()が呼び出されるのはなぜですか? DisposeとFinalizeはどのように異なりますか?

32
Nate222

CLRドキュメントには、Disposableオブジェクトを作成する人は誰でもDisposeを呼び出す責任があると記載されています。この場合、オブジェクトはNinjectによって作成されます。つまり、Disposeを明示的に呼び出すべきではありません。

Ninjectは、InTransientScope以外の別のスコープを持つすべてのDisposableオブジェクトを破棄します 作成されたオブジェクトが関連付けられているスコープオブジェクトがGCによって収集されるとすぐに 。そのため、すべてのDisposableオブジェクトはInTransientScope()ではないスコープでBinddにする必要があります。例えば。 NamedScope拡張機能 からInParentScope()を使用できます。これにより、注入されたオブジェクトがガベージコレクションされるとすぐにオブジェクトが破棄されます。

48
Remo Gloor