0

外部で構築されたクラスを使用して、サイトの多くの作業とルールを処理する Web アプリケーションを構築しています。ほとんどのページは、表示する必要がある情報を取得するために、このクラスにアクセスする必要があります。以前は、そのようなクラスをセッション変数に入れていたので、必要なときに簡単にアクセスでき、継続的に再インスタンス化する必要はありませんでした。

最初の質問です。このクラスをセッション変数に詰め込むのは悪い考えですか (あまり大きくありません)?

2 番目の質問です。サイト アプリ レイヤー クラスをセッションに保存するのが悪い考えではない場合、クラスを取得またはセッションに保存するために使用する集中型メソッドを作成する方法はありますか? ページがクラスを取得した後、そこにあることを確認し、そうでない場合は作成するなど、一連のコードページを繰り返し使用したくありません。

4

3 に答える 3

3

クラスを保存する場所を決定する前に、次の 2 つの質問に答える必要があります。

  1. このクラスはどれくらい生きるべきですか?
  2. どのスコープで表示する必要がありますか?

両方の質問に答える例: リクエスト、ユーザー セッション、アプリケーション。

このクラスがステートレス (データがなく、ロジックのみ) の場合、おそらくアプリケーションの存続期間中存続できます。これが各ユーザーに固有のデータである場合 (リクエストごとに再ロードする必要はありません)、セッションに直接配置して、次の段落をスキップできます。

さて、寿命を決めたら、いくつかの解決策があります。ライフスタイル管理の最適なソリューションは、IoC コンテナーです。より簡単な解決策は、ストレージを抽象化し、Current.MyClass のような静的ファサードを使用することです。この場合、Current に提供されたストレージに応じて、MyClass インスタンスがリクエスト、セッション、またはアプリケーションに格納されます。

ただし、指定されたクラスにシングルトンを実装しないでください。必要なインスタンスの数を決定する必要はなく、必要に応じて同じインターフェイスを持つ別のクラスに置き換える機能が制限されるためです。

于 2008-12-03T08:40:18.847 に答える
0

そもそもクラスをセッションに保存する必要があるかどうかは、まだ判断がつきません。私が質問したアプリでは、クラスをセッションに詰め込まないことを選択しました。実際には必要ありませんでした。怠け者でした。セッションを管理するこの方法を考え出すことは、常に価値がありました。これは、Web 開発でしばらくの間私を悩ませてきたものだからです。

私の研究から生まれたのは、セッション変数を管理するための静的クラスを作成することです。このクラスは、セッションへのすべての読み取りと書き込みを処理し、それらすべてを強く型付けして起動できるようにします。セッションのがらくたのためにあちこちで繰り返しコードを使用することは、常に私を悩ませてきました。タイプミスも少なくなります。

これで見つけたお気に入りの記事が 2 つあります。現在、そのうちの 1 つしか見つけることができず、見つけたらもう 1 つの記事を含める予定です。

1 つ目はCode Projectでした これは 2 つ目のリンク かもしれません

パターンは簡単で簡単です。また、URL クエリ文字列からパラメーターを取得するためのリクエスト用のクラスも作成しました。クッキーにも拡張しない理由はありません。

これはパターンの最初の使用でした。文字列のみを使用したため、プライベート メソッドは少し制限されていますが、これは任意のクラスまたはプリミティブ型を使用するように簡単に変更できます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;

namespace BDZipper.Site
{
    /// <summary>
    /// This class maintains all session variables for us instead of handeling them 
    /// individually in the session.  They are also strongly typed.
    /// </summary>
    public static class SessionManager
    {

        # region Private Constants
        // Define string constant for each property.  We use the constant to call the session variable
        // easier not to make mistakes this way.
        // I think for simplicity, we will use the same key string in the web.config AppSettings as
        // we do for the session variable.  This way we can use the same constant for both!
        private const string startDirectory = "StartDirectory";
        private const string currentDirectory = "CurrentDirectory";

        # endregion

        /// <summary>
        /// The starting directory for the application
        /// </summary>
        public static string StartDirectory
        {
            get
            {
                return GetSessionValue(startDirectory, true);
            }
            //set
            //{
            //    HttpContext.Current.Session[startDirectory] = value;
            //}
        }

        public static string CurrentDirectory
        {
            get
            {
                return GetSessionValue(currentDirectory, false);
            }
            set
            {
                HttpContext.Current.Session[currentDirectory] = value;
            }
        }
        //TODO: Update to use any class or type
        /// <summary>
        /// Handles routine of getting values out of session and or AppSettings
        /// </summary>
        /// <param name="SessionVar"></param>
        /// <param name="IsAppSetting"></param>
        /// <returns></returns>
        private static string GetSessionValue(string SessionVar, bool IsAppSetting)
        {
            if (null != HttpContext.Current.Session[SessionVar])
                return (string)HttpContext.Current.Session[SessionVar];
            else if (IsAppSetting)  // Session null with appSetting value
                return ConfigurationManager.AppSettings[SessionVar];
            else
                return "";
        }
    }
}
于 2009-01-05T23:30:06.943 に答える
0

使用しているフレームワークをまったく知らなければ、クラスをセッション ストアに入れるのは賢明ではないように思えます。そのユーザーに固有のデータがない限り、クラスはユーザーごとに 1 回コピーされます。

私ができる最善のアドバイスは、シングルトンクラスを持ち(グーグルで検索できます-それはデザインパターンです)、そのクラスに必要なクラスを返す関数を持たせるか、そうでない場合は作成することですまだ存在します。

于 2008-12-03T06:12:55.027 に答える