2008-12-02 16 views
1

我们有一个PageRoles XML文件,其中包含页面路径和可以访问该页面的用户角色。用于显示从xml中读取的数据的单例对静态类

我们在一个静态类中维护一个Dictionary,它获取类的静态构造函数。 该类有一个方法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) 
{ 
} 

} 

我们会不会更好使用Singleton模式这样做呢? 如果是,为什么?

亲切的问候。

+0

任何一个人都会将依赖的类紧密地耦合到这个类。问自己,“我将如何单独测试一个依赖于PageAccessChecker而不依赖于PageAccessChecker的类或方法?” @James Curran是正确的。 – TrueWill 2011-09-15 14:35:38

回答

2

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

你的实施,使得调用更简单IMO:

PageAccessChecker.CheckIfRoleAllowed(path); 

代替:

PageAccessChecker._default.CheckIfRoleAllowed(path); 
3

我可以看到使用Singleton模式(如果通过,比方说实现,静态属性)的两个优点:

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

的缺点可能是你需要使用锁进行访问线程安全的。

+0

实际上,通过调用构造函数的加载方法来加载文件。 当文件更改时,FileSystemWatcher的Changed方法也调用相同的方法。 – 2008-12-02 07:41:10

+0

用于FileSystemWatcher的Hooray - 我正要提出否则 – annakata 2008-12-02 09:00:32

3

其实你真的不想要单身人士或静态类。

首先,静态类的一个单例。我想你真正要问的是:“为了确保威胁安全,只存在一个威胁,换句话说,我需要一个'特殊'单身人士吗?”答案是“不”,因为你不想单身。

单身打算用于对象,其中可以只有一个,不适用于只需要一个的对象。这里不是这种情况。这种情况没有任何要求单身人士的情况。你真正想要的是一个叫做“全局变量”的东西。

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

+0

这不是那么简单:GlobalVar将会是一个类的类型,所以你* *在实现中寻找单例,而且imho更好地通过接口来解决桥梁比实际的全球参考 – annakata 2008-12-02 09:03:42

-1

如果你将类构造函数保持为私有的,那就没有实际的区别 - 它们都是可以被懒惰地初始化的全局变量。

如果您保持类构造函数为public或protected,并且只使用该模式来创建全局(不强制实施单个实例),则至少可以测试您的singleton类。

但是你应该真正尝试的是避免单例,而是使用依赖注入。见MiškoHevery的Singletons are Pathological Liars