频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

.NET上下文拦截(1)

来源:博客园 作者:TomCat 出处:巧巧读书 2008-05-24 进入讨论组

.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进程中,域提供了诸如垃圾回收,托管堆,和JIT,加载和卸载程序集等服务。也就是说,我们所有的IL代码必须运行在域中,当然,当我们启动一个.NET程序时,会创建一个默认的域来加载和运行我们的.NET程序,并提供托管堆。我们也可以创建新的域。所以,每个Windows 进程可以宿主多个域。在.NET中,对象是不能够跨域直接引用的,每个.NET对象都是他所属的域中的托管堆被创建的。对象的跨域访问,必须使用代理(Proxy),并且对象是可以被封送的(直接或间接继承自MarshalByRefObject),跨域访问对象就是所谓的远程访问(Remoting)。

在.NET中域的粒度仍然很大,如果我们不显式的创建新的域,通常我们程序中的所有组件(类),都运行在同一个域中。在.NET中,上下文(Context),提供了比域粒度更小的运行环境。域可以有多个上下文,但一个上下文只能属于一个域。

和域一样,我们的.NET组件(类)也必须运行在不同的上下文中,只不过不同的上下文提供不同的上下文服务,每个域中也有一个默认的上下文,默认的上下文但是不提供任何的服务。上下文最大的好处是让我们可以使用上下文拦截技术,为被宿主在上下文的组件(类)提供自定义的服务。这样,我们就可以实现所谓AOP编程。我们可以把AOP中所谓的管道工作作成服务,添加到上固定的下文服务中,这样每个对这个上下文中的组件(类)的调用,都将被拦截,然后把服务(管道方法)添加到组件(类),就好象把服务(管道方法)织入(AOP术语)到组件(类)中。

更多文章 更多内容请看.NET移动与嵌入式技术.NET开发手册专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章