【问题标题】:Singleton vs Static Class for exposing data read from xml用于公开从 xml 读取的数据的单例与静态类
【发布时间】:2008-12-02 07:24:56
【问题描述】:

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

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

每个页面在页面初始化时调用 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)
 {
 }

}

使用单例模式会更好吗? 如果是,为什么?

亲切的问候。

【问题讨论】:

  • 任何一个都将依赖类紧密耦合到这个类。问问自己,“我将如何对依赖于 PageAccessChecker 且独立于 PageAccessChecker 的类或方法进行单元测试?” @James Curran 是正确的。

标签: c# .net static singleton


【解决方案1】:

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

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

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

【讨论】:

  • 其实是通过构造函数调用load方法来加载文件的。当文件发生变化时,FileSystemWatcher 的 Changed 方法也会调用相同的方法。
  • FileSystemWatcher 万岁 - 我正要提出其他建议
【解决方案2】:

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

首先,静态类单例。我猜你真正要问的是“添加冗长的东西以确保它是安全的并且只存在一个威胁是否有好处,或者换句话说,我需要一个'特殊'单身人士吗?”答案是“否”,因为您不想要单身人士。

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

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

【讨论】:

  • 这并不是那么简单:GlobalVar 将成为一个类类型,所以您正在查看实现中的单例,恕我直言,最好用接口桥而不是实际的全局参考
  • @annakata:有什么区别?无论哪种方式,您都会获得全球参考。
  • @Annakata:我从没这么说过。它应该是类的实例对象。正如我所说,仅仅因为他只需要一个并不意味着实现不能允许多个。
  • 使用单例,您可以延迟初始化,直到需要它。您不能使用全局变量来做到这一点 - 除非您每次都对其进行测试并在访问之前对其进行初始化。然后你将该测试分解为一个静态方法,然后 - 嘿 presto - 一个单例!
【解决方案3】:

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

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

PageAccessChecker.CheckIfRoleAllowed(path);

代替:

PageAccessChecker._default.CheckIfRoleAllowed(path);

【讨论】:

    【解决方案4】:

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

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

    但您真正应该尝试的是避免单例并改用依赖注入。请参阅 Miško Hevery 的 Singletons are Pathological Liars

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 2012-04-12
      • 2013-08-19
      • 1970-01-01
      • 2012-12-15
      相关资源
      最近更新 更多