1

DataContextが実際にどのくらいの期間存続する必要があるのか​​疑問に思っていました。DinoEspositoのMicrosoft.NET:Architecting Applications for the Enterpriseのようなすべてのパターンと実践の本は、データコンテキストが長く存続してはならず、キャッシュされてはならないことを示しています。しかし、適切な時期はどのくらいですか?Webリクエスト全体、作業単位、トランザクション、一度に1つのクエリのみ?(通常、Webリクエストには複数の作業単位があると思います)

EntityFrameworkをWebアプリケーションのORMツールとして使用するとします。しかし、このシナリオのIDマップパターンはどうでしょうか。Datacontextを作成するCustomerDALの専用インスタンスと、その目的のために新しいDataContextを自分で作成する別のInvoiceDALがあるとします。すべてのDALの基本クラスを取得した場合、ObjectContextの単一のインスタンスが作成され、最後にこれが破棄されます。それは悪い実装と見なされますか?私の意見では、1つのWebリクエストに対して1つのObjectContextを使用することは理にかなっています。EntityFrameworkでサポートされているIDマップパターンを1つの利点として利用できます。

アイデア、コメント、考え、批判はありますか?

4

3 に答える 3

1

データコンテキストの存続期間は、アプリケーションの作業単位と同等である必要があります。Webアプリケーションでは、この作業単位は要求と相関しています。リクエストが届き、サーバーが一度に処理します。リクエストの最後に、このリクエストによって行われたすべての変更がデータベースに保持されます。これは、ほとんどのリクエストが単一のユーザーアクションに一致するWebアプリケーションの通常の動作です。

したがって、リクエストごとに1つのデータコンテキストのみが存在する必要があります。これは、作業単位のパターンだけでなく、パフォーマンスの考慮事項に関しても意味があります。データコンテキストは重量のあるオブジェクトであり、構築に費用がかかります。IDマップパターンの必要性の実装を通じてすべてのORマッピングツールですぐに使用できる第1レベルのキャッシュの利点は、1つのデータコンテキストのみの使用をさらに強調しています。

ASP.NETには、実装を容易にするアプリケーションとページのライフサイクルに2つのイベントがあります。

  1. Application_BeginRequest:データコンテキストの作成を承認します。
  2. Application_EndRequest:データコンテキストの破棄を承認します。

Webアプリケーションは必ずしもデータコンテキストを直接作成する必要はなく、SessionFactoryオブジェクトのメソッドを呼び出してデータコンテキストをインスタンス化する必要があるため、authorizeという単語の使用を賢明に選択します。

すべてのデータアクセス層オブジェクトまたはリポジトリは、SessionFactoryを呼び出して現在のデータコンテキストを取得できます。

Global.asaxのコードは次のようになります。


public static ISessionFactory SessionFactory { get; private set; }

void Application_Start(object sender, EventArgs e)
{
           SessionFactory = new SessionFactory();
}

void Application_BeginRequest(object sender, EventArgs e)
{
    var session = SessionFactory.OpenSession();
}

void Application_EndRequest(object sender, EventArgs e)
{
    SessionFactory.DisposeSession();
} 
于 2012-04-16T08:55:17.920 に答える
1

最も簡単な方法は、DataContextをできるだけ早く破棄することです。とはいえ、発生する頭痛の種に対処する意思がある限り、DataContextを好きなだけ維持することができます。

多くのものと同様に、答えは「それは依存する」であり、状況に依存します。単一の答えはありません。

Webアプリの場合、Webリクエストの存続期間中DataContextを維持することは、通常、処理するのが非常に簡単です。

短いライフタイムから始めて、キャッシングや長寿命のDataContextのその他の利点が必要な状況では、ライフタイムを長くすることをお勧めします。

于 2009-12-30T15:28:22.983 に答える
1

アレックスジェームスはこれについて良い記事を書いた。その中で、彼はあなたが考慮する必要があると述べています:

  • 廃棄
  • 建設費
  • メモリ使用量
  • スレッドセーフ
  • 無国籍
  • 自然な有限の寿命
于 2009-12-30T18:53:28.547 に答える