多層化された Asp.NET Web フォーム アプリケーションがあります。データ層には、エンティティ フレームワーク オブジェクト コンテキストのインスタンスDataAccess
を実装し、プライベート フィールドとして持つというクラスがあります。IDisposable
このクラスには、エンティティのさまざまなコレクションを返す多数のパブリック メソッドがあり、破棄されるとオブジェクト コンテキストが破棄されます。
DataAccess
私たちが直面してきた多くの問題により、オブジェクト コンテキスト (または のインスタンス) をサーバー上でより長くスコープ内に保持することが大きなプラスになると判断しました。Http リクエストごとに 1 つのインスタンスを持つために、この投稿HttpContext.Current.Items
のコレクションにインスタンスを保持することを提案しました。
私が疑問に思っているのは、オブジェクトコンテキストのインスタンスをオブジェクトに格納することでどのような問題/懸念/問題が発生するのでしょうかHttpContext.Current.Session
????
- ユーザーのセッションの有効期限が切れると、Session オブジェクトがファイナライズされ、ガベージ コレクション用に設定されるため、インスタンスは適切に破棄されると想定しています。
- ほとんどのデフォルトのブラウザー設定では、アプリが問題なく SessionId Cookie を配置できると想定しています。
- オブジェクト コンテキストが処理するデータの量は膨大ではなく、時間の経過に伴うキャッシュと比較的少数の同時ユーザーに関して、適切なサーバー ハードウェアに問題を引き起こすことはありません。
これは比較的迅速に実装でき、多くの既存の単体テストには影響しません。
AutoFac と ServiceProvider クラスを使用してインスタンスを提供します。ObjectContext のインスタンスが必要な場合、次のようなコードによって返されます。
private static Entities GetEntities(IContext context)
{
if (HttpContext.Current == null)
{
return new Entities();
}
if (HttpContext.Current.Session[entitiesKeyString] == null)
{
HttpContext.Current.Session[entitiesKeyString] = new Entities();
}
return (Entities)HttpContext.Current.Session[entitiesKeyString];
}
乾杯。