.NET :消息与AOP(二)

using System;
using System.Runtime.Remoting ;
using System.Runtime.Remoting.Services ;
using System.Runtime.Remoting.Activation ;
using System.Runtime.Remoting.Proxies ;
using System.Runtime.Remoting.Messaging ;

/*
本程序说明了截获是如何进行的,以及真实代理和透明代理之间的关系及交互。
*/
namespace Intercept_example
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Example exa = new Example("sky" ) ;
exa.say_hello() ;
}
}

//定义一个真实代理,用于实现一个特定的预处理和后处理
public class InterceptProxy : RealProxy
{
private readonly MarshalByRefObject target ;

public InterceptProxy(MarshalByRefObject obj ,Type type) :base(type)
{
this.target = obj ;
}

public override IMessage Invoke(IMessage msg)
{
IMethodCallMessage call = (IMethodCallMessage)msg ;

//如果触发的是构造函数,此时target的构建还未开始
IConstructionCallMessage ctor = call as IConstructionCallMessage ;
if(ctor != null)
{
System.Console.WriteLine("转发构造函数调用!") ;

RealProxy default_proxy = RemotingServices.GetRealProxy(this.target) ;

default_proxy.InitializeServerObject(ctor) ;
MarshalByRefObject tp = (MarshalByRefObject)this.GetTransparentProxy() ;

return EnterpriseServicesHelper.CreateConstructionReturnMessage(ctor,tp);

}

System.Console.WriteLine("预处理中......") ;
System.Threading.Thread.Sleep(5000) ;

IMethodReturnMessage result_msg = RemotingServices.ExecuteMessage(this.target ,call) ;

System.Console.WriteLine("后处理中......") ;
System.Threading.Thread.Sleep(5000) ;
System.Console.WriteLine("后处理结束!") ;

return result_msg ;

}
}

//定义一个特性,该特性可以将上面的真实代理与运用该特性的class联系起来
[AttributeUsage(AttributeTargets.Class)]
public class InterceptProxyAttribute : ProxyAttribute
{
//得到透明代理
public override MarshalByRefObject CreateInstance(Type serverType)
{
//未初始化的实例
MarshalByRefObject target = base.CreateInstance (serverType);

InterceptProxy rp = new InterceptProxy(target ,serverType) ;

return (MarshalByRefObject)rp.GetTransparentProxy() ;
}
}

[InterceptProxy]
public class Example : ContextBoundObject//放到特定的上下文中,该上下文外部才会得到该对象的透明代理
{
private string name ;
public Example(string a)
{
this.name = a ;
}

public void say_hello()
{
Console.WriteLine("hello ! " + name ) ;
}
}

/*
*(1) 当调用方和被调方位于不同的上下文时,调用方得到的是被调对象的透明代理。透明代理会将方法调用打包成一个IMessage对象,并传给实际代理的Invoke方法。
* Invoke方法的默认实现只是将IMessage对象传递到后面的通道(如堆栈生成器等)中。我们可以定制自己的真实代理,重写Invoke方法,为之加上预处理和后处理。
*(2)通过代理特性(如InterceptProxyAttribute)(从ProxyAttribute继承)将真实代理与目标class关联起来。这个代理特性主要重写ProxyAttribute的CreateInstance
* CreateInstance方法,在该方法中,在目标对象的外围包裹上真实代理(如InterceptProxy),而返回该真实代理的透明代理。
* (3)在程序中,不能直接通过真实代理来调用目标对象的方法,因为真实代理处理的是消息对象(IMessage),它是基于消息世界的。
* (4)只有持有透明代理的引用,我们才有可能加入截获(前处理和后处理)。
* (5)派生于ContextBoundObject的类,我们只能得到它的透明代理;派生于MashalByRefObject的类的对象,我们可能得到它的透明代理或者直接引用,这取决于被调方和目
* 标对象是否位于同一上下文中;不从这两个类派生的类的对象,我们只能得到它的直接引用。
*/

}

时间: 2024-09-17 04:04:13

.NET :消息与AOP(二)的相关文章

大型网站架构系列:消息队列(二) (转)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka).[第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源] 本次分享大纲 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务 常用消息队列 参考(推荐)资料 本

消息称中投二号国庆节前挂牌央企重组面临四难

中投二号挂牌在即 "排名靠后央企"不愿被打包 每经记者 汤白露 发自北京 昨日(8月17日),<每日经济新闻>记者获悉,中投二号即将于今年国庆节前挂牌,目前正在进行最后的人事任命.根据国资委规划,首批至少有10多家央企被整体纳入中投二号托管. 这一消息引爆业界关于下半年央企重组的期望.但是,由于整合标准不一致,多数排名靠后央企都不愿意"被装进"中投二号. 中国国际技术智力合作公司.彩虹集团等多家央企致电<每日经济新闻>,质疑外界关于公司&qu

.NET :消息与AOP(一)

方法调用与消息 如果一个目标对象委托给一个真实代理实例,那么所有对对应的透明代理的方法调用都会经过一个消息转换与反转换的过程,而 正是将方法调用转换为消息后,我们才有机会实现预(后)处理,这样更进一步的结果是 ==> 实现所谓的AOP. 1. 真实代理:从RealProxy派生,最主要的是复写Invoke方法.Invoke方法的主要职能是为截获方法调用加上预(后)处理,以此来实现AOP.(1) 一种真实代理类型就表示一种特定的预(后)处理,如果一个类希望自己的公共方法被外界调用时进行适当的预处理

CYQ.Data 轻量数据层之路 V2.0 震撼惊世 支持多数据库/内置Aop(二十五)

所有文章索引:CYQ.Data 轻量数据层之路 框架开源系列 索引   前言: 从V1.5发布到现在时隔20天了,终于发布2.0版本了,2.0系列版本由于引入多数据库支持,内部结构改动较大. 但是外面调用方式仍保持一致向下兼容,因此若从原来V1.N版本升级到2.N版本,只需要轻轻更换CYQ.Data.DLL即可,界面代码不需要改变.   疑问? 最近26号才刚发布了V1.5.5,怎么才3天又发布了2.0版本?就这么点时间改动就很大,那不是很不稳定? 解疑: V1.5.5版本是拿V1.5版本的源码

消息称陈年二次创业:建vjia.com服装销售平台

5月17日上午消息,据知情人士透露,VANCL创始人陈年正在筹备二次创业项目vjia.com,该网站为销售非自主品牌服饰的B2C网站,独立于自由品牌VANCL之外,该网站有望在本周内上线. 据透露,vjia.com陈年已经低调筹备一年多,其定位于非自主品牌的时尚类服饰销售平台.与目前服装B2C领域的淘宝商场等不同的是,vjia将自建仓库,对其销售的所有品牌进行仓储,由vjia统一发货. "可以理解为是一个网上的品牌商场,卖各种各样品牌的服饰,但是这些服饰vjia都是自己有仓储和库存,而不是依赖服

Spring中基于aop命名空间的AOP 二(声明一个切面、切入点和通知)

2.声明一个切面 在基于AOP命名空间的Spring AOP中,要声明一个切面,需要使用<aop:config/>的子标签 <aop:aspect>.<aop:aspect>标签有一个ref属性必须被赋值,它用于指定和该切面关联的 受管Bean(backing bean,以后我们都将使用Backing Bean来称呼这样的Bean).正如下例所示,该Bean 对应的java类是一个普通的java类,在该类中定义了切面的通知方法.此外,<aop:aspect>

RabbitMQ消息队列(二):”Hello, World“

<==RabbitMQ消息队列(一): Detailed Introduction 详细介绍        本文将使用Python(pika 0.9.8)实现从Producer到Consumer传递数据"Hello, World".      首先复习一下上篇所学:RabbitMQ实现了AMQP定义的消息队列.它实现的功能"非常简单":从Producer接收数据然后传递到Consumer.它能保证多并发,数据安全传递,可扩展.      和任何的Hello w

利用Visual C++实现QQ消息群发

一.引言 QQ一直是国内最令人瞩目的及时通讯软件,近6年的经营使其在IM市场有了"世界第一"名号.在国内市场,QQ的市场占有率已经超过了70%,用户群庞大,本人就是腾讯QQ的一个用户.不知QQ会员是否能够消息群发,但我这个免费用户是享受不了这个服务的,给同事和朋友们发通知好辛苦啊.在网上Google了一下,找到几个小软件,可是消息后面又加个广告尾巴.还是自己动手吧: 如果要分析腾讯QQ协议来编写发送QQ消息是很复杂的一件事情,那么,有没有简单的办法呢?答案是肯定的:有! 既然Windo

[python学习] 简单爬取维基百科程序语言消息盒

        文章主要讲述如何通过Python爬取维基百科的消息盒(Infobox),主要是通过正则表达式和urllib实现:后面的文章可能会讲述通过BeautifulSoup实现爬取网页知识.由于这方面的文章还是较少,希望提供一些思想和方法对大家有所帮助.如果有错误或不足之处,欢迎之处:如果你只想知道该篇文章最终代码,建议直接阅读第5部分及运行截图. 一. 维基百科和Infobox         你可能会疑惑Infobox究竟是个什么东西呢?下面简单介绍.        维基百科作为目前规