5

ASP.NET Web API の独自の実装に取り​​組んできましたが、IHttpControllerActivatorいつ (またはなぜ?)HttpRequestMessage拡張メソッド " RegisterForDispose" を使用するのか疑問に思っています。

IHttpController は IDisposable を継承せず、IHttpController の実装は独自の破棄ロジックを保証しないため、このような例を見て、その関連性を確認できます。

public IHttpController Create(HttpRequestMessage リクエスト、HttpControllerDescriptor controllerDescriptor、タイプ controllerType)
{
    var controller = (IHttpController) _kernel.Get(controllerType);
    request.RegisterForDispose( new Release(()=> _kernel.Release(コントローラー)));
    コントローラーを返します。
}

しかし、私はこのようなものを見て、不思議に思うようになりました:

public IHttpController Create(
    HttpRequestMessage リクエスト、
    HttpControllerDescriptor コントローラー記述子、
    タイプコントローラタイプ)
{
    if (controllerType == typeof(RootController))
    {
        vardisposableQuery = 新しい DisposableStatusQuery();
        request.RegisterForDispose(disposableQuery);
        新しい RootController(disposableQuery) を返します。
    }
    null を返します。
}

この場合、おそらく ApiController または MVC コントローラーであるため、RootController はここでの処分用に登録されていませんか? - したがって、自分自身を処分します。

DisposableStatusQuery のインスタンスは使い捨てオブジェクトであるため、廃棄用に登録されていますが、コントローラーがインスタンス自体を廃棄できなかったのはなぜでしょうか? RootController は、disposableQuery (というより、インターフェイスまたは抽象ベース) の知識を持っているため、それが使い捨てであることがわかります。

HttpRequestMessage.RegisterForDisposeを実際に使用する必要があるのはいつですか?

4

4 に答える 4

1

私が役に立つと思ったシナリオの 1 つは、カスタム ActionFilter の場合です。

属性はキャッシュ/再利用されるため、属性内のアイテムはコントローラーが破棄されることに依存すべきではありません (私の理解では - そしておそらく注意事項があります) ... そうではないカスタム属性を作成するために特定のコントローラーのタイプ/実装に関連付けられているため、この手法を使用してクリーンアップできます。私の場合、それはアンビエント DbContextScope 属性用です。

于 2015-04-09T14:15:57.690 に答える
1

RegisterForDisposeリクエストが破棄されたときに呼び出されるフックです。これは、多くの場合、依存性注入コンテナーの「一部」と一緒に使用されます。

たとえば、一部のコンテナ (Castle.Windsor など) はデフォルトで、解決するすべての依存関係を追跡します。LifecycledComponentsReleasePolicyこれは、作成されたすべてのコンポーネントを追跡すると述べているWindsor ReleasePolicy によるものです。つまり、コンテナーがまだコンポーネントを追跡している場合、ガベージ コレクターはクリーンアップできません。これにより、メモリリークが発生します。

したがって、たとえばIHttpControllerActivator、依存性注入コンテナーで使用するように独自に定義する場合、具体的なコントローラーとそのすべての依存関係を解決するためです。リクエストの最後に、コンテナによって作成されたすべての依存関係を解放する必要があります。そうしないと、大きなメモリ リークが発生します。あなたはそれを行うこの機会を持っていますRegisterForDispose

于 2015-04-09T15:57:27.510 に答える
0

RegisterForDispose を DI コンテナーで使用します。ブログの投稿に基づいて、作成したすべてのオブジェクトをクリアするように、各リクエストの後にコンテナー (ネストされたコンテナー) を破棄するように実装しました。

于 2012-12-18T04:55:13.993 に答える