2012-04-10 25 views
0

私は、ほぼ半分の時間実行するクエリからデータを取得し、それをWebページに持ってくる必要がある状況があります。 私は、アプリケーション用のEntity Framework(EF、データアクセスレイヤ、Bizロジックレイヤ、UI)と一緒に4層アーキテクチャを使用しています。 DALへのインスタンスが作成されたとき(DALはデータベースからデータを取得する)、このインスタンスを再利用できるようになるためシングルトンメソッドを使用しようとしているため、追加のインスタンスは作成されません同一セッション内の。 セッション状態を設定し、状態サーバーでインスタンスの可用性をチェックするにはどうすればよいですか?セッション状態変数とシングルトンクラス

public static Singleton getInstance() { 
    if (**instance == null**) 
     instance = new Singleton(); 
    return instance; 
    } 

ブロックifにはどのようなものがありますか? ifブロックでどのような条件を確認する必要がありますか?私は本当に私がやらなければならないことについては確信しています。

PS:このセッションには、5分のタイムアウトが必要です。私はこれがWeb.configファイルで指定できると聞いています。それは本当ですか?

+0

セッションは名前の値のコレクションです。 DALのインスタンスを名前で取得し、値がnullであるかどうかを確認します。それがヌルでない場合は、DALのインスタンスにキャストします。それが価値あるものであれば、私はこのパターンに従わないだろう。リクエストごとにインスタンスを作成して削除することを避けたいDALの作成については、どれほど費用がかかりますか? – Maess

+0

DALのオブジェクトが作成されるたびに、DBにアクセスし、複雑なクエリを含むストアドプロシージャにアクセスし、データが出るまでに1分ほどかかります。私はインスタンスを格納し、それを高速アクセスのために2度目に再利用することを考えています。 – krishgopinath

+3

ユーザーセッションごとに個別のDALを作成していますか? DALがセッション固有の理由は何ですか?静的なプロパティを持つDALのファクトリを持つことはできませんか?プロパティが呼び出されると、DALインスタンスのファクトリの静的メンバが 'null'かどうかを確認します。存在する場合は、インスタンス化して戻ります。そうでない場合は、ただ返します。 – David

答えて

1

正に、Entity Frameworkコンテキストを使用して、データベースにアクセスする必要があるたびに、つまり各メソッドで作成する必要があります。そのように使用するように最適化されています。接続プールは、毎回EFコンテキストを再作成する際にペナルティがないことを確認します。これがベストプラクティスです。

しかし、あなたのDALは単なるDBアクセス以上のものかもしれません。セッションごとにシングルトンを別々にする場合は、最初のリクエストでインスタンスを作成し、セッションに保存し、使用する前にそのセッションが存在するかどうかを確認する必要があります。スレッドの安全性により、コードは次のようになります。

class DALClass 
{ 
    private static object instanceLock = new object(); 

    public static DALClass Instance 
    { 
     get 
     { 
      if (Session["DALInstance"] == null) 
      { 
       lock (instanceLock) 
       { 
        if (Session["DALInstance"] == null) 
        { 
         Session["DALInstance"] = new DALClass(); 
        } 
       } 
      } 

      return (DALClass)Session["DALInstance"]; 
     } 
    } 
} 
+0

私は、DALオブジェクトがシングルトンでなければならないと思ったり、セッションでキャッシュされているとは思わない。結果をキャッシュしますが、作業を行っているオブジェクトはキャッシュしません。たいていDALはDIによって処理され、Web要求ごとに1回作成されます。城文書を参照してください:http://stw.castleproject.org/Default.aspx?Page=LifeStyles&NS=Windsor&AspxAutoDetectCookieSupport=1 –

+0

私が指摘しているように答え、セッションでDALを持っているのは良い考えではありません。それ以上のことがない限り、私たちは知らない。 –

+0

@Maciej:セッション内のエンティティにコンテキストを設定します。それはいいですか? – krishgopinath

1

依存性注入に適した、よく定義されたアーキテクチャを持っているように思えます。 DIを使用すると、IOCコンテナを取得してシングルトンオブジェクトまたは一時オブジェクトを返すことができます。しかし、Web環境でシングルトンを使用するのは非常に注意が必要です。なぜなら、シングルトンは価値のある問題よりも多くの問題を引き起こすことが多いからです。

実行しているクエリにユーザー固有のデータが含まれている場合、MVCのようなパターンを使用している場合は、アプリケーションのUI部分を構成するコード内のセッションにそのクエリの結果を配置します。コントローラまたはMVPをプレゼンタに追加します。

これらのパターンが使用されていない場合は、ビジネスレイヤー内でセッションに情報を配置することを検討できますが、セッションをまとめてその依存関係をビジネスオブジェクトに挿入する必要があります。 "IUserSession"のようなものです。ビジネスプロジェクトには、 "system.Web"などの参照が含まれていてはなりません。

+0

重要な点は、クエリの結果(DALではない)がセッションに入ることです。 Sessionオブジェクト自体には、既に '同じセッション内に追加のインスタンスが作成されない'というすべての特性があります。 (SQLタグ付きの質問にクエリを投稿すると、最適化に役立つかもしれません。ユーザが選択肢がない限り、Webページでは30秒が長すぎます) – mafue

関連する問題