Singleton vs Static Class用于公开从xml读取的数据

时间:2008-12-02 07:24:57

标签: c# .net static singleton

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

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

每个页面调用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 个答案:

答案 0 :(得分:3)

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

  1. 您可以延迟加载XML文件,直到访问第一页。
  2. 您可以检查XML文件是否已在磁盘上更改,并在下次访问时自动重新加载。
  3. 缺点可能是你需要使用锁来使访问线程安全。

答案 1 :(得分:3)

实际上你真的不想要单身人士或静态职业。

首先,静态类单例。我想你真正要问的是“增加钻井平台以确保其安全,并且只存在一个,或者换句话说,我需要一个'特殊的'单身人士吗?”答案是“否”,因为你不需要单身。

单例适用于只能为一个的对象,而不适用于只需要一个对象的对象。这不是这种情况。这种情况没有任何要求单身人士的事情。你真正想要的是一个叫做“全局变量”的东西。

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

答案 2 :(得分:2)

你确实使用单身人士。简单地说,有两个常用的单例实现,另一个是实例化类并且有一个静态成员引用这个实例。

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

PageAccessChecker.CheckIfRoleAllowed(path);

而不是:

PageAccessChecker._default.CheckIfRoleAllowed(path);

答案 3 :(得分:-1)

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

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

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