1

基本的に、ユーザーがWebサイトにログインすると、データベースにクエリを実行し、いくつかの設定をリストに保存するクラスを作成しました(キー/ペアの値があります)。

これは、データベースに再度アクセスすることなく、常にこれらの設定にアクセスできるようにしたいためです。

これらをクラスに入れ、SQL クエリを介してフィールドをループし、リストに追加します。

次に、アプリケーションの別の部分からこれらの変数にアクセスするにはどうすればよいですか? またはこれを行うためのより良い方法はありますか?私はサーバー側について話しているのであって、実際にはクライアント側ではありません。

これが私が現時点で持っていたものの例です:

public static void createSystemMetaData()
{
    string constring = ConfigurationManager.ConnectionStrings["Test"].ConnectionString;
    SqlConnection sql = new SqlConnection(constring);
    sql.Open();

    SqlCommand systemMetaData = new SqlCommand("SELECT * FROM SD_TABLES", sql);
    //Set Modules
    using (SqlDataReader systemMetaDataReader = systemMetaData.ExecuteReader())
    {
        while (systemMetaDataReader.Read())
        {
            var name = systemMetaDataReader.GetOrdinal("Sequence").ToString();
            var value = systemMetaDataReader.GetOrdinal("Property").ToString();
            var Modules = new List<KeyValuePair<string, string>>();
            Modules.Add(new KeyValuePair<string, string>(name, value));
        }
    }
}

ありがとう

4

4 に答える 4

2

クラスの静的プロパティは、IIS で ASP.NET を使用していると仮定して、アプリケーション プールの存続期間中保持されます。

したがって、非常に単純なクラスは次のようになります。

public static class MyConfigClass
{
    public static Lazy<Something> MyConfig = new Lazy<Something>(() => GetSomethings());

    public static Something GetSomethings()
    {
        // this will only be called once in your web application
    }
}

その後、単に呼び出すだけでこれを消費できます

MyConfigClass.MyConfig.Value
于 2013-11-04T11:11:21.557 に答える
0

他の人が指摘したように、これらの値をグローバル メモリに保持するリスクは、値が変更される可能性があることです。また、グローバル変数は、アプリケーションのさまざまな部分でこれらの値を読み書きすることになり、問題のデバッグが必要以上に困難になる可能性があるため、設計上の決定としては不適切です。

一般的に採用されているソリューションは、データベース アクセスをファサード クラス内にラップすることです。リクエストごとにデータベースにヒットするのを避けたい場合は、このクラスで値をキャッシュできます。さらに、変更もファサードを介してルーティングされるため、データがいつ変更されたかを認識し、変更が発生したときにキャッシュを空にする (データベースの再読み取りを強制する) ことができます。追加のボーナスとして、データベースに触れずにコードをテストするためにファサードをモックすることが可能になります (データベースへのアクセスは単体テストが難しいことで有名です)。

于 2013-11-04T11:25:14.350 に答える
0

ボブが提案したように、ユーザーが少ない場合はSessionStateを使用できますが、ユーザーが多い場合は、状態サーバーに移動するか、毎回データベースからロードする必要がある場合があります。

于 2013-11-04T11:15:33.063 に答える