读书笔记(二)对象激活和上下文
任何程序都需要在某个平台提供的环境中执行.对于传统的炒作系统而言,这种运行时环境的主要形式就是一个进程.一个进程不仅为你的代码提供了象虚拟内存,线程和内核对象这样的资源,还为你和别人的代码间提供了一个隔离边界.这种隔离不仅带来了某种程度上的保护,这样你的代码不会受到别人错误代码的影响还给你的程序提供一种独有的特性,比如可以单独的做安全配置,或者当前目录路径.
代码隔离在进程之间和进程内部都是游泳的.COM,COM+和公用语言运行时CLR都已经建立了这种模型以在进程内部内部提供细颗粒的代码隔离.在COM+和CLR中,这种细颗粒的隔离单元被称为上下文(context).
COM+上下文是COM单元的一部分,而COM单元本身是用于对线程对象分组的进程的一部分.CLR上下文是CLR应用程序的一部分,而CLR应用程序域本身是用于对共享相同安全和版本策略的对象分组的进程的一部分.上下文是COM+和.NET企业服务的编程模型的核心.每个被配置在COM+目录中的组件都会被自动的关联一个上下文.这种上下文使得系统拦截成为可能.
在COM+里配置的那些对象总是在一个上下文内运行.对象所需要的上下文由服务组件类上设定的上下文特性所定义.这些上下文特性定义了一个组件对于运行环境的需求.如果这里对象的调用这已经运行于一个上下文中.(因为它也是一个已配置的组件),则会检查这个上下文时候和这里对象所需要的相兼容.如果是,则这个对象将在调用者所在的上下文中运行.
如果这个上下文和这个对象所定西的不兼容,则将建立一个新的上下文.CLR和COM+都依赖于代理以保证对象间的上下文边界.代理(proxy)是处于不同的上下文中的真实对象的一个替身对象,代理负责在一二方法调用转换上下文.
既然上下文是根据一组用于声明对象所需要运行环境的属性来规定的,为一个对象定义一个上下文意味着这个对象支农从这个上下文内部直接访问.如果访问该对象的调用者所在上下文有所不同的化,则它不能直接调用该对象上的方法.而要通过一个代理.
(简单对象和上下文无关.普通的.NET对象都是简单对象,COM 对象总是绑定到一个上下文)
简单对象(Agile Object)
绑定了上下文的对象(Context Bound Object/CBO)
在.NET用于实现夸上下文通信的技术是.NET Remoting.所以CBO类和SynchroizationAttribute(继承自ContextAttribute类)被放在System.Runtime.Remoting.Context命名空间下.
.NET的安全边界:应用户程序域,一个进程可以包含多个应用程序域,来自一个域的对象不能和其他域的对象直接互相操作,互相操作用的是应用程序域信道.
2using System.Threading;
3using System.Runtime.Remoting.Contexts;
4
5[Synchronization]
6class A:ContextBoundObject
7{
8 public void Method1() {
9 string threadName = Thread.CurrentThread.Name;
10 Console.WriteLine(threadName + ": Method1 started");
11 Thread.Sleep(3000);
12 Console.WriteLine(threadName + ": Method1 finished");
13 }
14}
15
16class Test
17{
18 A obj = new A();
19
20 public void ThreadMethod()
21 {
22 obj.Method1();
23 }
24
25 static void Main(string[] args)
26 {
27 Test test = new Test();
28
29 //create and start a thread
30 Thread t1 = new Thread(new ThreadStart(test.ThreadMethod));
31 t1.Name = "Thread 2";
32 t1.Start();
33
34 //invoke Method1 with the main thread
35 Thread.CurrentThread.Name = "Thread 1";
36 test.obj.Method1();
37 t1.Join();
38 }
39}
所有服务组件的基类都是在System.EnterpriseService命名空间下的ServicedComponent类.这个类继承于System.ContextBoundObject类,所有服务组件都有一个.NET Remoting上下文.
当一个.NET服务组件被创建时,此时不仅建立了.NET上下文,还建立了一个连接到.NET上下文的COM+上下文.