1

ページパスとそのページにアクセスできるユーザーロールを含むPageRolesxmlファイルがあります。

静的クラスでディクショナリを維持しています。このクラスは、クラスの静的コンストラクターにロードされます。このクラスには、ページパスを受け取り、boolを返すメソッドCheckIfRoleAllowedがあります。

各ページは、PageInitでCheckIfRoleAllowedを呼び出します。

static class PageAccessChecker
{
 static Dictionary<string, UserRoleType[]> _PageAccessPermissions;
 static FileSystemWatcher _XmlWatcher;

 static PageAccessChecker()
 {
   // Load page access permissions from xml
   // Set FileSystemWatcher watcher to watch for changes
 }

 public static CheckIfRoleAllowed(string pagePath)
 {
 }

}

シングルトンパターンを使用してこれを行う方がよいでしょうか?はいの場合、なぜですか?

敬具。

4

4 に答える 4

3

シングルトンパターンを使用することの2つの利点がわかります(たとえば、静的プロパティを介して実装されている場合)。

  1. 最初のページにアクセスするまで、XMLファイルのロードを遅らせることができます。
  2. XMLファイルがディスク上で変更されたかどうかを確認し、次回のアクセス時に自動的に再ロードできます。

欠点は、ロックを使用してアクセスをスレッドセーフにする必要があることです。

于 2008-12-02T07:33:49.903 に答える
3

実際には、シングルトンも静的クラスも必要ありません。

まず、静的クラスシングルトンです。あなたが本当に求めているのは、「リグマロールを追加して脅威に安全であり、存在するのは1つだけであることを保証することは有益ですか、つまり、「特別な」シングルトンが必要ですか?」ということだと思います。シングルトンは必要ないので、答えは「いいえ」です。

シングルトンは、1 つだけが必要なオブジェクトではなく、 1 つしか存在できないオブジェクトを対象としています。ここではそうではありません。シングルトンを必要とするこの状況については何もありません。実際に必要なのは、「グローバル変数」と呼ばれるものです。

"ちょっと待って!!!" あなたは言う。「グローバル変数は悪ではないか?」そうですね、あります。しかし、それはここでは関係ありません。静的クラスまたはシングルトンなどと呼ぶかどうかに関係なく、実際にここにあるのはグローバル変数です。呼び方を変えても何も変わりません。

于 2008-12-02T08:04:25.253 に答える
2

シングルトンを使用します。単純に、シングルトンには2つの通常の実装があり、もう1つはクラスをインスタンス化し、静的メンバーがこのインスタンスを参照することです。

あなたの実装は呼び出しをより簡単なIMOにします:

PageAccessChecker.CheckIfRoleAllowed(path);

それ以外の:

PageAccessChecker._default.CheckIfRoleAllowed(path);
于 2008-12-02T07:31:34.383 に答える
-1

クラス コンストラクターを非公開にしておく場合、実際の違いはありません。どちらも遅延初期化できるグローバル変数です。

クラス コンストラクターを public または protected に保ち、パターンを使用してグローバルを作成する (単一のインスタンスを強制しない) だけの場合は、少なくともシングルトン クラスをテストできます。

しかし、実際に試す必要があるのは、シングルトンを避け、代わりに依存性注入を使用することです。Miško Hevery によるSingletons are Pathological Liarsを参照してください。

于 2008-12-02T08:08:09.507 に答える