2017-05-14 2 views
1

シンプルなeインジェクタのドキュメントは、一時的な登録とシングルトンの登録の両方でどのように処分されるのかについてはっきりしています。ドキュメントは、事前に構築されたオブジェクト以外のすべてで登録されたシングルトンは、処分される。シンプルなインジェクタASP.NETのシングルトンの廃棄

私の質問には、特にASP.NETアプリケーションが破棄されるときに処分する必要があるというシングルトン登録が含まれています(そのサービスが破棄されたときに残りのメッセージを送信します)。私の登録のほとんどは一時的なものであり、それぞれのリクエストが処分されると処分されます。 VS/IISExpressでデバッグするとき、私のシングルトンがいつ廃棄されるのか、コンテナ自体が最終的に廃棄されるのを見ることはありません。私のコンソールアプリケーションで&紺碧のサービス私は単に完了したらcontainer.Dispose()を呼び出します。この最終的なクリーンアップのためのASP.NETの手がかりは?

答えて

2

シングルトンを削除するには、アプリケーション終了時に明示的にContainer.Dispose()を呼び出す必要があります。これは、たとえばGlobal.asaxのApplication_Endイベントで実行できます。しかし、注意してください。

私はそのサービスが

に配置されているときApplication_Endイベントが実行されない多くの理由があるので、これは、非常に悪いアイデアだと思い、残りのメッセージを送信します。 IISは非常に積極的にアプリケーションを強制終了でき、停電やその他のハードウェアの誤動作も起こります。その場合は、まだローカルバッファに残っているメッセージは失われます。

アプリケーションのハートビートやロギングに使用される揮発性メッセージの場合は問題はないかもしれませんが、重要なビジネスイベントが記述されている場合は、耐久性のあるキューイングまたは記憶メカニズムを使用する必要があります。

VS/IISExpressでのデバッグ、私が今まで私のシングルトンは非常によくできて配置

を取得するときに表示されません。 Webアプリケーションをデバッグするとき、Webアプリケーションはそれ自身で停止することはありません。デバッグを停止する場合は、ファイナライザやクリーンアップメソッドを実行することなくアプリケーションが突然停止されるか、デバッグを停止するとアプリケーションはバックグラウンドで実行され続けます。それでもあなたはクリーンアップの出来事が見られないことを意味します。

+0

このようなアプローチの問題については、私はまったく同意しますが、ほとんどの場合、何もしない(つまり、送信されていないメッセージを投げ捨てる)よりも優れています。冗長なアプローチを使用しても、フェイルセーフではありません。私が求めているのは、ホストされたIIS ASP.NET環境で、SimpleInjectorコンテナが破棄されていることを確認する正しい方法は何ですか。少なくとも、ローカルにキューに入れられたメッセージを試してみるチャンスがあります。 OWIN OnAppDisposingはApplication_Endと等価ですか? – pseabury

+1

メッセージを失うことが問題である場合、私は本当にあなたのデザインを変更することをお勧めします。これらのメッセージは、残りのリクエスト実行と同じデータベーストランザクション内に保持されます。これは、メッセージの損失を防ぐ非常に一般的な方法です。 OWINについて:私はOnAppDisposingが何をしているのかよくわかりません。あなたはドキュメントを読んでこれをテストしなければなりません。 – Steven

+0

特定のメッセージングがどのようにw.r.tで行われたかをもう一度見ていきます。データトランザクション。 IIRCでは、Azure ServiceBus(私たちが使用しているもの)へのメッセージの書き込みは、周囲のDBトランザクションスコープの外で行う必要がありました。 https://docs.particular.net/nservicebus/azure-service-bus/understanding-transactions-and-delivery-guarantees?version=asb_6を参照してください。ディスカッションありがとうSteven! – pseabury

関連する問題