7

私はasp.net-mvcアプリケーションに取り組んでいます。linq データ コンテキストは、構造マップによってサービス オブジェクトに渡されます。私は、ハイブリッドのスコープを持つように設定されています。これはすべて正常に機能します。

protected override void configure()
{
    ForRequestedType<AetherDataContext>()
        .TheDefaultIs(() => new AetherDataContext())
        .CacheBy(InstanceScope.Hybrid);
}

問題は、私がメモリを使い続けていることです。IDisposable インターフェイスが実際に呼び出されているかどうか疑問に思っています。

誰でもアイデアはありますか?

私のメモリ例外を引き起こしている可能性のあるものについて、誰かが他の考えを持っていなかったのですか?

アップデート:

いくつかの追加情報として、いくつかのメソッドをデータ コンテキストに詰め込んで、そこにブレーキ ポイントを配置しました。

protected override void Dispose(bool disposing)
{
    Debug.WriteLine("Disposing: " + DateTime.Now);
    base.Dispose(disposing);
}

public new void Dispose()
{
    Debug.WriteLine("Disposing: " + DateTime.Now);
    base.Dispose();
}

これを正しい方法で行っているかどうかはよくわかりませんが、新しいメソッドが呼び出されると思いますか?

とにかく、どちらのブレーキポイントもヒットしませんでした。ただし、同じクラスのコンストラクターはすべてのリクエストで呼び出されました。理想的ではないと私は考えています。

4

3 に答える 3

4

さて、StructureMapの最新バージョン(2.3.5)には、便利な小さなメソッドがあります

HttpContextBuildPolicy.DisposeAndClearAll();
HttpContext と ThreadLocal の便利なメソッドをクリーンアップします。HttpContextBuildPolicy.DisposeAndClearAll()、ThreadLocalStoragePolicy.DisposeAndClearAll()。いずれかのメソッドを呼び出すと、キャッシュされたすべてのインスタンスが取り出され、オブジェクトが IDisposable の場合は IDispose が呼び出されます。

以前は、dispose メソッドが呼び出されていませんでしたが、それを Application_EndRequest に追加したところ、呼び出されるようになりました。これで私の記憶力の問題が解決されることを願っています。

我々は見るであろう。

于 2009-02-02T15:26:48.947 に答える
1

これは、私が 2 日前に尋ねた質問のほぼ正確なコピーです: IDisposable を実装するアイテムを含むセッション

InstanceScope.Hybrid は、オブジェクトが存在する場合は HttpContext.Current.Items 内に格納するか、存在しない場合は ThreadLocal ストレージに格納するだけで、InstanceScope.HttpSession は HttpSession と ThreadLocal を使用する以外は同じように機能します。アイテム コレクションはリクエストごとに存在するため、私の質問で指摘されたパターンを実装すると、現在のリクエストの最後に Dispose が発生するはずです。

于 2009-02-02T14:54:14.363 に答える
0

解決策です。そのカッシーニが問題を引き起こしています。基本的に、リクエストごとに新しいコンテキストを作成します。そのため、コンテキストがもう一度作成されるのを見ていました.なぜそれが私を適切に使い捨てと呼んでいなかったのか私にはわかりません. しかし、私はこれがカッシーニと関係があると信じる準備ができています.

于 2009-02-03T14:55:13.970 に答える