C# 用于公开从xml读取的数据的单例与静态类

C# 用于公开从xml读取的数据的单例与静态类,c#,.net,static,singleton,C#,.net,Static,Singleton,我们有一个PageRoles xml文件,其中包含页面路径和可以访问该页面的用户角色 我们在一个静态类中维护一个字典,它为该类加载int静态构造函数。 该类有一个方法CheckIfRoleAllowed,该方法接受页面路径并返回bool 每个页面调用初始页面上的CheckIfRoleAllowed static class PageAccessChecker { static Dictionary<string, UserRoleType[]> _PageAccessPermiss

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

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

每个页面调用初始页面上的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
{
静态字典_PageAccessPermissions;
静态FileSystemWatcher\u XmlWatcher;
静态页面访问检查器()
{
//从xml加载页面访问权限
//将FileSystemWatcher设置为监视更改
}
公共静态CheckIfRoleAllowed(字符串页面路径)
{
}
}
我们使用单例模式做这件事会更好吗? 若有,原因为何


问候您。

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

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

PageAccessChecker.CheckIfRoleAllowed(path);
而不是:

PageAccessChecker._default.CheckIfRoleAllowed(path);

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

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

PageAccessChecker.CheckIfRoleAllowed(path);
而不是:

PageAccessChecker._default.CheckIfRoleAllowed(path);

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

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

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

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

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

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

    实际上,您既不需要单例类,也不需要静态类

    首先,静态类是单例类。我猜你真正想问的是“添加繁琐的规则以确保它是安全的,并且只有一个,或者换句话说,我需要一个‘特殊’的单身汉吗?”答案是“不”,因为你不想要单身汉

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


    “但是,等等!!!”你说。“全局变量不是邪恶的吗?”是的,确实存在。但这在这里无关紧要。不管你称它为静态类还是单例类,或者其他什么,这里实际上有一个全局变量。叫它别的什么也改变不了什么

    实际上,您既不想要单例类,也不想要静态类

    首先,静态类是单例类。我猜你真正想问的是“添加繁琐的规则以确保它是安全的,并且只有一个,或者换句话说,我需要一个‘特殊’的单身汉吗?”答案是“不”,因为你不想要单身汉

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


    “但是,等等!!!”你说。“全局变量不是邪恶的吗?”是的,确实存在。但这在这里无关紧要。不管你称它为静态类还是单例类,或者其他什么,这里实际上有一个全局变量。叫它别的什么也改变不了什么

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


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


    但您真正应该尝试的是避免使用单例,而是使用依赖注入。请参见Miško Hevery。

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


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


    但您真正应该尝试的是避免使用单例,而是使用依赖注入。请参见Miško Hevery。

    实际上,该文件是通过从构造函数调用加载方法加载的。当文件更改时,FileSystemWatcher的已更改方法也会调用相同的方法。FileSystemWatcher万岁-我正要建议其他方法实际上,文件是通过从构造函数调用加载方法加载的。当文件发生更改时,FileSystemWatcher的更改方法也会调用相同的方法。FileSystemWatcher万岁-我想提出其他建议其实并不是那么简单:GlobalVar将成为一种类类型,因此您正在考虑实现中的单例,imho用接口桥解决这个问题比用实际的全局reference@annakata:有什么区别?不管怎样,你都会得到一个全局引用。@Annakata:我从来没说过。它应该是类的实例对象。正如我所说的,仅仅因为他只需要一个并不意味着实现不能允许多个。使用singlton,您可以延迟初始化,直到需要它为止。你不能用一只手做那件事