加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_常德站长网 (https://www.0736zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > Asp教程 > 正文

Asp.net 面向接口框架之应用程序上下文作用域组件

发布时间:2022-10-05 16:11:59 所属栏目:Asp教程 来源:
导读:  确实HttpContext.Current.Items可以实现这样的效果,但是HttpContext.Current并不是无处不在,非Web应用程序为null

  就算是Web项目也不能滥用HttpContext.Current,在异步线程里面该属性也是null,不信的可以
  确实HttpContext.Current.Items可以实现这样的效果,但是HttpContext.Current并不是无处不在,非Web应用程序为null
 
  就算是Web项目也不能滥用HttpContext.Current,在异步线程里面该属性也是null,不信的可以试试
 
  但是HttpContext.Current还是很有用的,我这里实现的AppContext就有调用HttpContext.Current,如果为null,再调用另一个更神秘的东西CallContext
 
  大家看一下实现代码:
 
  
  在web程序中有异步操作会有线程切换,需要线程间复制上线文对象,使用HttpModule(以下代码来自一个博客园大神,我几乎没改)
 
  
  4、服务(配置)作用域
 
  4.1 先看建模代码
  
 
  稍微解读一下:
 
  A:Greet是用来打招呼,name对who发一个问候语
 
  B:Person明显就是代表一个人,其中有一个Chindren属性,代表从属子对象(为了简化使用相同类型)
 
  C:Person有一个Sayer属性,用来对其他"人"打招呼的
 
  D:从方法Greet(Greet sayer, Person person)可以看出,如果取不到sayer对象会打招呼失败(提示sayer is miss)
 
  E:对另一个对象Great的时候会遍历每个子对象分别对那个对象"问候"一下(这家的小孩还真有礼貌,大人问候谁,每个小孩都问候他)
 
  4.2 再看测试代码
 
  ASP 变量_asp.net static 变量_javascript获取asp的变量
 
  也解读一下:
 
  A:定义了a,a1,b及a的另一个子对象
 
  B: 其中只有a对象设置了Sayer属性
 
  C:a对象Great了b(其中隐含a的所有子对象都对b进行Greate),之后a1对象单独Greate了一下b
 
  4.3 看运行结果
 
  哈哈,看到结果是不是有点惊讶啊
 
  A:a对b的Hello是成功的很正常,但是a的两个子对象也对b的Hello成功了
 
  B:更神奇的是,a1单独对b的Hello缺是失败的(不是继承了父对象的属性)
 
  C:这里对上线文又进了一步,是作用域,只有a对b使用自己的Sayer属性时,其他对象(不一定是自己的子对象)也可以截获Sayer的值,但是等a对象使用完毕后就回收了,其他人就用不了了
 
  4.4 原理解析
 
  ASP 变量_javascript获取asp的变量_asp.net static 变量
 
  这里有一个using的作用域,AppContext.CreateResource在上线文中注册或者查找类型为Greate名字为A的,候选值为Sayer的对象,保存在resource.Entity中
 
  4.5 来看一下实现的源代码
 
  
  哈哈,是不是有点复杂啊
 
  A:实现IDisposable以便使用using来控制作用域
 
  B:Dispose也不是简单的就把作用域的对象删除,如果_needDispose为false不删除对象(不是自己创建的对象无权删除)
 
  C:除了删除有的时候还要Restored(_needRestored为true),自己的作用域结束,把备份的_entity0还回去
 
  D:Init方法尝试从作用域获取对象并备份到_entity0,如果本次候选对象无效直接使用作用域已有对象,如果有效就覆盖作用域(有_entity0备份能还原回来)
 
  E:是不是非常有意思,就像定义变量一样,小作用域可以覆盖上级作用的变量,离开小作用域,外面作用域的变量又可以使用了
 
  5、作用域的作用
 
  5.1 我特意开发这个功能是用来简化系统配置的
 
  5.2 比如日志(含异常调试日志)几乎是每个对象都需要的功能
 
  如果每个对象都配置这些通用属性,配置的工作量太大了,配置文件太乱了
 
  如果硬编码写死,那岂不就倒退到八百年前了
 
  并不是所有都不配,只把特殊需要的配置,如果需要日志在最外面配置(或者只初始化一个作用域),里面调用的子对象也都可以共享外层的配置(共享日志服务)
 
  有人可能说冲突了怎么办,用name隔离
 
  6、应用程序上下文缓存
 
  javascript获取asp的变量_asp.net static 变量_ASP 变量
 
  
  这个缓存的作用域只能是当前会话(线程或者Request),所以天生的线程安全(所以那个字典我都没用ConcurrentDictionary)
 
  有人可能要笑话我,缓存不都是分布式吗?你那个缓存利用率太低了吧?
 
  是的,你要说缓存利用率,确实不能和分布式比。但是要想到这个比session还session(不用清除下次请求重新初始化,也不用担心被人杜撰(修改sessionId))的高速缓存(直接字典),自然也和session一样不用担心用户数据串
 
  用起来简单的不得了,直接New就可以使用,哪怕定义一个全局静态变量都是“线程(会话)安全”的,也可以配置在容器里面放心使用
 
  测试项目下载
 
  该组件暂时就先写这么多吧。写这篇文章的目的除了给大家分享自己的东西外,最主要的还是想得到博客园大神的指导,因为框架一旦开始使用再做调整就很要命,其一希望框架能做的更通用更好用,大家一起使用。其二把可能的问题尽早的发现,在正式使用之前更加完善。有些硬伤ASP 变量,比如接口、方法签名定义等如果不合理推广后也好修改,可能只能作为框架的缺陷存在了。接口一改,依赖这个接口的所有实现类都要改,很恐怖的。也是因为原来开发匆忙的框架“缺陷”太多,我不得不下定决心开发新框架。
 
  这么这么多天每天长时间写代码,每天都写得出汗,写出了不少代码,却是今天下班后第一次调试,并且调试通过了一个我非常喜欢的上线文作用域组件(当然还有优化的地方)
 

(编辑:应用网_常德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!