在.NET 中,上下文(Context)的概念贯穿着.NET的很多核心内容.他提供了类似运行环境的服务和内容.在.NET中,基于上下文拦截的技术一直是很隐晦的,没有很多的文档说明。然儿,基于上下文的拦截的技术却提供了很好很强大的功能。使我们能方便是实现类似 AOP 的编程模式。.NET3.0 中的WCF更是大量使用了上下文拦截技术。
在.NET 中,组件服务通常的颗粒是域(Domain)和上下文(Context).其中,在域中提供的服务通常只有'同步域'.当然,.NET 中也提供了很多COM+服务,但需要被服务的组件(类)直接或间接继承自ServicedComponent(被服务的组件)..NET中提供的COM+服务全部在命名空间System.EnterpriseServices中,在其中,提供了诸如消息队列,即时激活,对象池...等服务.
在使用.NET 开发时,我们都知道我们使用任何一种.NET支持的语言编写的代码都是托管代码.所谓托管代码生成的IL语言只能运行在CLR中.并且享受CLR提供的垃圾回收,托管堆...等.但是,Windows在为我们的IL运行提供一个进程时,并不知道所谓的托管环境,Windows只负责提供进程,在进程中没有托管环境的概念.在Windows 进程和IL之间,域提供了桥梁的作用。在Windows进程中,所有域共享CLR提供的诸如垃圾回收,托管堆,和JIT,加载和卸载程序集等服务。也就是说,我们所有的IL代码必须运行在域中,当然,当我们启动一个.NET程序时,会创建一个默认的域来加载和运行我们的.NET程序,并提供托管堆。我们也可以创建新的域。所以,每个Windows 进程可以宿主多个域。在.NET中,对象是不能够跨域直接引用的,每个.NET对象都是他所属的域所属的托管堆被创建的。对象的跨域访问,必须使用代理(Proxy),并且对象是可以被封送的(直接或间接继承自MarshalByRefObject),跨域访问对象就是所谓的远程访问(Remoting)。
在.NET中域的粒度仍然很大,如果我们不显式的创建新的域,通常我们程序中的所有组件(类),都运行在同一个域中。在.NET中,上下文(Context),提供了比域粒度更小的运行环境。域可以有多个上下文,但一个上下文只能属于一个域。
和域一样,我们的 .NET组件(类)也必须运行在不同的上下文中,只不过不同的上下文提供不同的上下文服务,每个域中也有一个默认的上下文,默认的上下文但是不提供任何的服务。上下文最大的好处是让我们可以使用上下文拦截技术,为被宿主在上下文的组件(类)提供自定义的服务。这样,我们就可以实现所谓AOP编程。我们可以把AOP中所谓的管道工作作成服务,添加到上固定的下文服务中,这样每个对这个上下文中的组件(类)的调用,都将被拦截,然后把服务(管道方法)添加到组件(类),就好象把服务(管道方法)织入(AOP术语)到组件(类)中.