我们有一个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)
{
}
}
使用单例模式我们会更好吗? 如果是,为什么?
亲切的问候。
答案 0 :(得分:3)
我可以看到使用单例模式的两个优点(如果通过静态属性实现):
缺点可能是你需要使用锁来使访问线程安全。
答案 1 :(得分:3)
实际上你真的不想要单身人士或静态职业。
首先,静态类是单例。我想你真正要问的是“增加钻井平台以确保其安全,并且只存在一个,或者换句话说,我需要一个'特殊的'单身人士吗?”答案是“否”,因为你不需要单身。
单例适用于只能为一个的对象,而不适用于只需要一个对象的对象。这不是这种情况。这种情况没有任何要求单身人士的事情。你真正想要的是一个叫做“全局变量”的东西。
“但是,等等!!!”你说。 “全球变量不是邪恶的吗?”嗯,是的,有。但这与此无关。无论你将它称为静态类还是单例或其他什么,你在这里实际拥有的是一个全局变量。把它称之为别的东西不会改变任何东西。
答案 2 :(得分:2)
你确实使用单身人士。简单地说,有两个常用的单例实现,另一个是实例化类并且有一个静态成员引用这个实例。
您的实施使调用更简单IMO:
PageAccessChecker.CheckIfRoleAllowed(path);
而不是:
PageAccessChecker._default.CheckIfRoleAllowed(path);
答案 3 :(得分:-1)
如果你保持类构造函数是私有的,那就没有什么区别了 - 它们都是可以懒惰地初始化的全局变量。
如果您将类构造函数保持为public或protected并且仅使用该模式来创建全局(不强制执行单个实例),则至少可以测试您的单例类。
但你真正应该尝试的是避免单例并使用依赖注入。请参见MiškoHevery的Singletons are Pathological Liars。