.Net組件程序設計之上下文

 .Net組件程序設計之上下文函數

在後續篇幅的遠程調用的文章裏有說到應用程序域,那是大粒度的控制程序集的邏輯存在,那麼想對對象的控制又由誰來作主呢?
沒錯了,就是上下文。CLR把應用程序域更細化了,在應用程序裏添置了上下文的概念,上下文是有着一套約束而且負責管理在其中的全部對象的訪問的這麼一個邏輯的存在。
舉個例子吧,雖然有點不恰當可是將就點理解吧。
好比說社會就是應用程序域,咱們所住的住宅社區就是上下文的容器,社區的門衛就是上下文的行爲,門衛+社區=上下文。而咱們就是對象,社區的門衛對於進出社區的陌生人都會問一句:你進來找哪家?找誰?幹什麼的?
而真正的上下文也是幹這個的,實際要忙的多(本篇講的有點AOP的意思)
測試

圖1spa

上圖中只是初步的示例結構,咱們接着往下看。線程

在系統中,咱們能夠經過Context類的靜態屬性DefaultContext獲取到當前對象所在的上下文,設計

Context context = Context.DefaultContext;

固然也能夠經過Thread類的靜態屬性CurrentContext來獲取到當前的上下文code

Context context = Thread.CurrentContext;

圖2
對象

(左端紅線開頭表明線程開始,紅線末端表明着線程介紹)blog

在上下文體系中,是由上下文綁定對象(ContextBoundObject)、上下文屬性(IContextAttrbitute)、上下文成員屬性(IContextProperty)和消息接收器構成的。繼承

本篇幅只涉及到體系中的前三個知識點,也就是自定義組件服務,到底是怎麼實現的?接口

在開始講以前這裏要說一下上下文和對象類型,在應用程序域裏會有一個默認的上下文,普通的對象能夠任何上下文裏使用,這樣的對象被稱爲上下文敏捷對象,而有的對象只能在某個特性的上下文中使用,就是繼承自ContextBoundObject類型的對象,這樣的對象被稱爲 面向上下文對象。

怎麼去理解自定義組件服務呢?

1.上下文成員屬性(IContextProperty)

 1     /// <summary>
 2     /// 上下文成員屬性
 3     /// </summary>
 4     public class ContextWriterService:IContextProperty
 5     {
 6 
 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     using System.Runtime.Remoting;
 2     using System.Runtime.Remoting.Contexts;
 3     using System.Runtime.Remoting.Activation;
 4 
 5 
 6     [AttributeUsage(AttributeTargets.Class)]
 7     public class ContextWriterAttribute :Attribute, IContextAttribute
 8     {
 9 
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     [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類型,而且拿來使用的。

這些都是上下文壞境中的一部分,固然還有最重要的一部分:消息接收器,本篇幅不做介紹了,會在之後的篇幅中說到。

 

 

 

做者:金源

出處:http://www.cnblogs.com/jin-yuan/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面

相關文章
相關標籤/搜索