1

我们有一个 PageRoles xml 文件,其中包含页面路径和可以访问该页面的用户角色。

我们在一个静态类中维护一个 Dictionary,该类为该类加载了 int 静态构造函数。该类有一个 CheckIfRoleAllowed 方法,它接受页面路径并返回一个布尔值。

每个页面在 Page Init 上调用 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

我可以看到使用单例模式的两个优点(如果通过静态属性实现):

  1. 您可以延迟加载 XML 文件,直到访问第一页。
  2. 您可以检查磁盘上的 XML 文件是否已更改,并在下次访问时自动重新加载。

一个缺点可能是您需要使用锁使访问线程安全。

于 2008-12-02T07:33:49.903 回答
3

实际上,您真的不想要单例或静态类。

首先,静态类单例。我想您真正要问的是“添加繁琐的内容以确保其威胁安全并且仅存在一个是否有好处,或者换句话说,我是否需要一个'特殊'单身人士?” 答案是“否”,因为您不想要单身人士。

单例适用于只能有一个的对象,而不适用于只需要一个的对象。这不是这里的情况。这种情况不需要单例。你真正想要的是一个叫做“全局变量”的东西。

“可是等等!!!” 你说。“全局变量不是邪恶的吗?” 嗯,是的,有。但这在这里无关紧要。无论你称它为静态类还是单例或其他什么,你实际上拥有的是一个全局变量。将其称为其他东西不会改变任何事情。

于 2008-12-02T08:04:25.253 回答
2

你确实使用了单例。简单地说,单例有两种常用的实现,另一种是实例化类并具有引用此实例的静态成员。

您的实现使调用更简单 IMO :

PageAccessChecker.CheckIfRoleAllowed(path);

代替:

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

如果您将类构造函数保持为私有,则没有真正的区别-它们都是可以延迟初始化的全局变量。

如果您将类构造函数保持为公共或受保护,并且仅使用该模式来创建全局(而不是强制执行单个实例),那么您至少可以测试您的单例类。

但是您真正应该尝试的是避免单例并改用依赖注入。请参阅Miško Hevery 的单身人士是病态的骗子。

于 2008-12-02T08:08:09.507 回答