热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:C#:所以如果静态类是存储全局状态信息的不良做法,那么提供相同方便性的好方法是什么?分享

C#:所以如果静态类是存储全局状态信息的不良做法,那么提供相同方便性的好方法是什么?我一直注意到静态类在用于存储全局信息方面在SO上获得了很多不好的代表。(而且全局变量一般被嘲笑)

C#:所以如果静态类是存储全局状态信息的不良做法,那么提供相同方便性的好方法是什么?

我一直注意到静态类在用于存储全局信息方面在SO上获得了很多不好的代表。 (而且全局变量一般被嘲笑)我只想知道下面的例子有什么好的选择……

我正在开发一个WPF应用程序,并且根据当前登录用户的ID过滤了从我的数据库中检索到的数据的许多视图。 同样,我的应用中的某些点应该只能被视为“管理员”的用户访问。

我目前正在静态类中存储loggedInUserIdisAdmin bool。

我的应用程序的各个部分需要这些信息,我想知道为什么它在这种情况下不理想,以及替代品是什么。 起床和跑步似乎非常方便。

我唯一可以想到的替代方法是使用IoC容器将Singleton实例注入需要此全局信息的类中,然后类可以通过其接口与之通信。 然而,这是否过度/导致我陷入分析瘫痪?

提前感谢您的任何见解。


更新

因此,我倾向于通过IoC进行dependency injection,因为它可以更好地提供可测试性,因为我可以交换一个服务,如果需要,可以使用模拟提供“全局”信息。 我想剩下的是注入的对象是单身还是静态。 ?

如果等待查看是否还有其他讨论,请问问Mark的答案。 我不认为这是正确的方式。 我只是想看到一些可以启发我的讨论,因为似乎有很多“这是坏的”,“这是坏的”,在没有任何建设性替代方案的情况下对某些类似问题的陈述。


更新#2所以我选择了罗伯特的答案,因为它是一个很好的选择(我认为替代方案是一个奇怪的词,可能是One True Way,因为它是内置于框架中)。 它并没有强迫我创建一个静态类/单例(尽管它是线程静态的)。

唯一让我感到好奇的是,如果我必须存储的“全局”数据与用户身份validation无关,那将如何处理。

忘记单身人士和静态数据。 这种访问模式在某个时候会让你失望。

创建自己的自定义IPrincipal并在适当的登录点替换Thread.CurrentPrincipal。 您通常会保留对当前IIdentity的引用。

在用户登录的例程中,例如,您已validation其凭据,请将自定义主体附加到线程。

IIdentity currentIdentity = System.Threading.Thread.CurrentPrincipal.Identity; System.Threading.Thread.CurrentPrincipal = new MyAppUser(1234,false,currentIdentity); 

在ASP.Net中,您还可以同时设置HttpContext.Current.User

 public class MyAppUser : IPrincipal { private IIdentity _identity; private UserId { get; private set; } private IsAdmin { get; private set; } // perhaps use IsInRole MyAppUser(userId, isAdmin, iIdentity) { if( iIdentity == null ) throw new ArgumentNullException("iIdentity"); UserId = userId; IsAdmin = isAdmin; _identity = iIdentity; } #region IPrincipal Members public System.Security.Principal.IIdentity Identity { get { return _identity; } } // typically this stores a list of roles, // but this conforms with the OP question public bool IsInRole(string role) { if( "Admin".Equals(role) ) return IsAdmin; throw new ArgumentException("Role " + role + " is not supported"); } #endregion } 

这是执行此操作的首选方式,并且它在框架中是有原因的。 这样您就可以以标准方式访问用户。

如果用户是匿名的(未知),我们还会执行添加属性的操作,以支持混合匿名/登录身份validation方案的方案。

另外:

这里还有许多其他的答案可以解释为什么静态(包括Singleton)对你不利,所以我不会详细介绍(虽然我全心全意地将这些情绪放在第二位)。

作为一般规则,DI是要走的路。 然后,您可以注入一项服务,告诉您需要了解的有关环境的任何信息。

但是,由于您正在处理用户信息,Thread.CurrentPrincipal可能是一个可行的替代方案(尽管它 Thread Static)。

为方便起见,您可以围绕它包装强类型的User类 。

我会尝试不同的方法。 静态数据类会让你遇到麻烦 – 这来自经验。 你可以拥有一个User对象(请参阅@Robert Paulson的答案以获得一个很好的方法)并在构建它时将其传递给每个对象 – 它可能对你有用,但你会得到很多模板代码,只能在任何地方重复。

您可以将所有对象存储在具有必要权限的数据库/加密文件中,然后根据您的用户权限动态加载所有这些对象。 使用数据库上的简单管理表单,它很容易维护(文件有点难)。

您可以创建RequiresAdminPermissionAttribute对象以应用于所有敏感对象,并在运行时针对User对象检查它以有条件地加载到对象。

虽然你现在的路线有优点,但我认为还有一些更好的选择。

上述就是C#学习教程:C#:所以如果静态类是存储全局状态信息的不良做法,那么提供相同方便性的好方法是什么?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
author-avatar
鸳鸯520_205
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有