0

ほぼ 30 分間実行されるクエリからデータを取得し、それを 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ファイルで指定できると聞いています。それは本当ですか?

4

2 に答える 2

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"];
        }
    }
}
于 2012-04-10T17:23:18.110 に答える
1

依存性注入に適した明確に定義されたアーキテクチャがあるように思えます。DI を使用すると、IOC コンテナーからシングルトン オブジェクトまたは一時的なオブジェクトを返すことができます。ただし、Web 環境でのシングルトンの使用は十分に注意してください。

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

これらのパターンが使用されていない場合は、情報をビジネス層内のセッションに配置することを検討できますが、セッションをまとめて、その依存関係をビジネス オブジェクト (たとえば、「IUserSession」など) に注入する場合のみです。ビジネス プロジェクトには、「system.Web」などへの参照を含めないでください。

于 2012-04-10T16:35:26.593 に答える