.Net组件程序设计之上下文

简介:

 .Net组件程序设计之上下文

在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?
没错了,就是上下文。CLR把应用程序域更细化了,在应用程序里添置了上下文的概念,上下文是有着一套约束并且负责管理在其中的所有对象的访问的这么一个逻辑的存在。
举个例子吧,虽然有点不恰当但是将就点理解吧。
比如说社会就是应用程序域,我们所住的住宅社区就是上下文的容器,社区的门卫就是上下文的行为,门卫+社区=上下文。而我们就是对象,社区的门卫对于进出社区的陌生人都会问一句:你进来找哪家?找谁?干什么的? 
而真正的上下文也是干这个的,实际要忙的多(本篇讲的有点AOP的意思)

图1

上图中只是初步的示例结构,我们接着往下看。

在系统中,我们可以通过Context类的静态属性DefaultContext获取到当前对象所在的上下文,

Context context = Context.DefaultContext;

当然也可以通过Thread类的静态属性CurrentContext来获取到当前的上下文

Context context = Thread.CurrentContext;

图2

(左端红线开头代表线程开始,红线末端代表着线程介绍)

在上下文体系中,是由上下文绑定对象(ContextBoundObject)、上下文属性(IContextAttrbitute)、上下文成员属性(IContextProperty)和消息接收器构成的。

本篇幅只涉及到体系中的前三个知识点,也就是自定义组件服务,究竟是怎么实现的?

在开始讲之前这里要说一下上下文和对象类型,在应用程序域里会有一个默认的上下文,普通的对象可以任何上下文里使用,这样的对象被称为上下文敏捷对象,而有的对象只能在某个特性的上下文中使用,就是继承自ContextBoundObject类型的对象,这样的对象被称为 面向上下文对象。

怎么去理解自定义组件服务呢?

1.上下文成员属性(IContextProperty)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  1      /// <summary>
  2      /// 上下文成员属性
  3      /// </summary>
  4      public  class  ContextWriterService:IContextProperty
  5     {
 
  7          public  void  Freeze(System.Runtime.Remoting.Contexts.Context newContext)
  8         {
  9             
10         }
11 
12          public  bool  IsNewContextOK(System.Runtime.Remoting.Contexts.Context newCtx)
13         {
14              return  true ;
15         }
16 
17          public  string  Name
18         {
19              get  return  "ContextService" ; }
20         }
21 
22          /// <summary>
23          /// 提供的服务
24          /// </summary>
25          /// <param name="meg"></param>
26          public  void  WriterMessage( string  meg)
27         {
28             Console.WriteLine(meg);
29         }
30     }

IContextProperty接口的几个成员: Name只读属性,成员属性名称,用作上下文成员属性集合中的关键字,也可以当作是自定义服务的关键字和名称。 Freeze:冻结上下文 IsNewContextOK:判断当前上下文是否满足需求,提供一个放弃创建上下文的机会,如果这个函数返回False的情况下。

IContextProperty类型的对象会存在于上下文的ContextProperties中,当然不是直接添加的,当我们获取到上下文对象的时候,已经上下文对象被冻结了。

 

2.上下文属性(IContextAttrbitute)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  1      using  System.Runtime.Remoting;
  2      using  System.Runtime.Remoting.Contexts;
  3      using  System.Runtime.Remoting.Activation;
 
 
  6     [AttributeUsage(AttributeTargets.Class)]
  7      public  class  ContextWriterAttribute :Attribute, IContextAttribute
  8     {
 
10          public  void  GetPropertiesForNewContext(IConstructionCallMessage msg)
11         {
12             msg.ContextProperties.Add( new  ContextWriterService());
13         }
14 
15          public  bool  IsContextOK(System.Runtime.Remoting.Contexts.Context ctx, IConstructionCallMessage msg)
16         {
17             ContextWriterService contextService =
18                 ctx.GetProperty( "ContextService" as  ContextWriterService;
19             
20              if  (contextService !=  null )
21             {
22                  return  true ;
23             }
24              return  false ;
25         }
26     }

IContextAttribute接口成员:
IsContextOK函数:在运行时调用此方法确定当前上下文是否存在需要的自定义属性,也就是确定当前类型是否在当前上下文中激活。
GetPropertiesForNewContext:是在IsContextOK方法确定了不OK之后调用此方法,这里的IConstructionCallMessage接口类型对象,会被传递到新建的上下文中,并且新建的上下文会根据IConstructionCallMessage类型当中的 
ContextProperties来添加为自己的自定义服务,这也是唯一的一个机会可以添加自定义服务到上下文中。
我这里也有一个疑问,望知道的大神给个指点,就是怎么在当前的默认上下文中添加自定义服务?

3.上下文绑定对象(ContextBoundObject)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  1     [ContextWriter()]
  2      public  class  MyContextObject : ContextBoundObject
  3     {
  4          public  void  CallCurrentContextWriterService()
  5         {
  6             Context context = Thread.CurrentContext;
  7             ContextWriterService contextWriterService =
  8                 context.GetProperty( "ContextService" as  ContextWriterService;
  9              if  (contextWriterService !=  null )
10             {
11                 contextWriterService.WriterMessage( "当前上下文ID:" +context.ContextID +  "-测试信息" );
12             }
13         }
14     }

显而易见MyContextObject是可以获取到ContextWriterService类型,并且拿来使用的。

这些都是上下文坏境中的一部分,当然还有最重要的一部分:消息接收器,本篇幅不作介绍了,会在以后的篇幅中说到。

 





     本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1421942,如需转载请自行联系原作者





相关文章
|
2月前
|
前端开发 C# 数据库
.NET中使用BootstrapBlazor组件库Table实操篇
.NET中使用BootstrapBlazor组件库Table实操篇
|
3月前
|
开发框架 前端开发 .NET
七天.NET 8操作SQLite入门到实战 - (1)第七天BootstrapBlazor UI组件库引入
七天.NET 8操作SQLite入门到实战 - (1)第七天BootstrapBlazor UI组件库引入
|
7月前
|
移动开发 网络协议 NoSQL
.NET Core WebSocket实现简易、高性能、集群即时通讯组件
.NET Core WebSocket实现简易、高性能、集群即时通讯组件
122 0
|
16天前
|
搜索推荐 API C#
.NET开源快速、强大、免费的电子表格组件
.NET开源快速、强大、免费的电子表格组件
|
4月前
|
SQL 数据库 开发工具
“.NET视频总结:认识框架的结构和组件,掌握开发工具的奥妙“
“.NET视频总结:认识框架的结构和组件,掌握开发工具的奥妙“
56 0
|
5月前
|
编解码 JSON 算法
一个支持.Net 7的WinForm开源UI组件框架
一个支持.Net 7的WinForm开源UI组件框架
81 0
|
7月前
|
容器
.NET Core - 选项框架:服务组件集成配置的最佳实践
.NET Core - 选项框架:服务组件集成配置的最佳实践
|
9月前
|
开发框架 JavaScript 前端开发
.NET 8新预览版本使用 Blazor 组件进行服务器端呈现
.NET 8新预览版本使用 Blazor 组件进行服务器端呈现
160 0
.NET 8新预览版本使用 Blazor 组件进行服务器端呈现
|
10月前
【vb.net机房收费系统】之没有包含要从继承的组件的已生成程序集
【vb.net机房收费系统】之没有包含要从继承的组件的已生成程序集
25 0
|
开发框架 JavaScript 前端开发
Vue.js 3.0搭配.NET Core写一个文件上传组件
Vue.js 3.0搭配.NET Core写一个文件上传组件
172 0