Castle ProxyGenerator 接口代理的问题。

问题描述

1.首先引用dllCastal.Core.dll2.publicinterfaceIStorageNode{boolIsDead{get;set;}voidSave(stringmessage);}publicinterfaceIDao{}publicclassBaseNode:IDao{protectedstringTestBase(){return"BaseNode";}}publicclassStorageNode:BaseNode,IStorageNode{privatestring_name;publicStorageNode(stringname){this._name=name;}publicboolIsDead{get;set;}publicvoidSave(stringmessage){Console.WriteLine(string.Format(""{0}"wassavedto{1}",message,this._name));}}publicclassDualNodeInterceptor:IInterceptor{privateIStorageNode_slave;publicDualNodeInterceptor(IStorageNodeslave){this._slave=slave;}publicvoidIntercept(IInvocationinvocation){IStorageNodemaster=invocation.InvocationTargetasIStorageNode;if(master.IsDead){IChangeProxyTargetcpt=invocationasIChangeProxyTarget;//将被代理对象master更换为slavecpt.ChangeProxyTarget(this._slave);//测试中恢复master的状态,以便看到随后的调用仍然使用master这一效果master.IsDead=false;}invocation.Proceed();}}publicclassCallingLogInterceptor:IInterceptor{privateint_indent=0;privatevoidPreProceed(IInvocationinvocation){if(this._indent>0)Console.Write("".PadRight(this._indent*4,''));this._indent++;Console.Write("Intercepting:"+invocation.Method.Name+"(");if(invocation.Arguments!=null&&invocation.Arguments.Length>0)for(inti=0;i<invocation.Arguments.Length;i++){if(i!=0)Console.Write(",");Console.Write(invocation.Arguments[i]==null?"null":invocation.Arguments[i].GetType()==typeof(string)?"""+invocation.Arguments[i].ToString()+""":invocation.Arguments[i].ToString());}Console.WriteLine(")");}privatevoidPostProceed(IInvocationinvocation){this._indent--;}publicvoidIntercept(IInvocationinvocation){this.PreProceed(invocation);invocation.Proceed();this.PostProceed(invocation);}}3.测试代码[TestMethod]publicvoidTestMethod1(){ProxyGeneratorgenerator=newProxyGenerator();IDaodaoInstance=newStorageNode("master");IStorageNodetemp=daoInstanceasIStorageNode;//为什么temp不为nullIDaonode1=generator.CreateInterfaceProxyWithTarget(daoInstance,newDualNodeInterceptor(newStorageNode("slave")),newCallingLogInterceptor());IStorageNodenode=node1asIStorageNode;//为什么node会是nullnode.Save("mymessage");//应该调用master对象node.IsDead=true;node.Save("mymessage");//应该调用slave对象node.Save("mymessage");//应该调用master对象}问题是加红的地方。为什么node为null呢。

解决方案

本帖最后由 kissfu 于 2016-04-12 09:13:23 编辑
解决方案二:
[TestMethod]publicvoidTestMethod1(){ProxyGeneratorgenerator=newProxyGenerator();IDaodaoInstance=newStorageNode("master");IStorageNodedaoInstance2=newStorageNode("master");IStorageNodetemp=daoInstanceasIStorageNode;//为什么temp不为nullvarnode1=generator.CreateInterfaceProxyWithTarget(typeof(IDao),newType[]{typeof(IStorageNode)},daoInstance,newDualNodeInterceptor(newStorageNode("slave")),newCallingLogInterceptor());IStorageNodenode=node1asIStorageNode;//为什么node会是nullnode.ToString();node.Save("mymessage");//应该调用master对象node.IsDead=true;//下面运行会报错,原因见TestMethod12()//node.Save("mymessage");//应该调用slave对象//node.Save("mymessage");//应该调用master对象}[TestMethod]publicvoidTestMethod12(){//interfaceproxywithinterfacetarget与interfaceproxywithtarget基本类似,//但他提供了一个更改被代理对象(真实对象)的机会//只有在interfaceproxywithinterfacetarget的情况下IInterceptor的接口参数IInvocation对象//才实现了IChangeProxyTarget接口ProxyGeneratorgenerator=newProxyGenerator();IStorageNodedaoInstance=newStorageNode("master");IStorageNodetemp=daoInstanceasIStorageNode;//为什么temp不为nullIStorageNodenode=generator.CreateInterfaceProxyWithTargetInterface<IStorageNode>(daoInstance,newDualNodeInterceptor(newStorageNode("slave")),newCallingLogInterceptor());//StorageNodenode=node1asIStorageNode;//为什么node会是nullnode.Save("mymessage");//应该调用master对象node.IsDead=true;node.Save("mymessage");//应该调用slave对象node.Save("mymessage");//应该调用master对象}

时间: 2024-07-28 17:52:40

Castle ProxyGenerator 接口代理的问题。的相关文章

Spring的无接口代理实现AOP

package com.rx.spring.cglib; public class UserManagerImpl { // implements UserManager { public void addUser(String username, String password) { System.out.println("-------UserManagerImpl.addUser()----------"); } public void deleteUser(int id) {

5、Python与设计模式--代理模式

一.网络服务器配置白名单 代理模式是一种使用频率非常高的模式,在多个著名的开源软件和当前多个著名的互联网产品后台程序中都有所应用.下面我们用一个抽象化的简单例子,来说明代理模式. 首先,构造一个网络服务器: #该服务器接受如下格式数据,addr代表地址,content代表接收的信息内容 info_struct=dict() info_struct["addr"]=10000 info_struct["content"]="" class Serv

23-java基础加强(反射、泛型、注解、动态代理)

一.反射 1. 一段java代码在程序运行期间会经历三个阶段: source-->class-->runtime     Person.java-Person.class  à  类加载到内存 Person.class –> 创建对象 程序运行   2. Class 对象     在java中用一个Class对象来表示一个java类的class阶段     Class对象封装了一个java类中定义的成员变量.成员方法.构造方法.类名.包名等   3. 反射     反射就是获得一个jav

java代理模式与动态代理模式详解_java

1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费.但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的.这点很重要!

Java代理机制

1 引言 我们书写执行一个功能的函数时,经常需要在其中写入与功能不是直接相关但很有必要的代 码,如日志记录,信息发送,安全和事务支持等,这些枝节性代码虽然是必要的,但它会带 来以下麻烦: 枝节性代码游离在功能性代码之外,它下是函数的目的,这是对OO是一种破坏 枝节性代码会造成功能性代码对其它类的依赖,加深类之间的耦合,而这是OO系统所竭 力避免的 枝节性代码带来的耦合度会造成功能性代码移植困难,可重用性降低 从法理上说,枝节性代码应该`监视'着功能性代码,然后采取行动,而不是功能性代码 `通知'

为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]

ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只是一个很轻量级的框架,但是在大部分情况下能够满足我们的需要.不过我觉得它最缺乏的是针对AOP的支持,虽然这个依赖注入框架提供了扩展点使我们可以很容易地实现与第三方框架的集成,但是我又不想"节外生枝",为此我们趁这个周末写了一个简单的Interception框架来解决这个问题.通过这个命名为Dora.Interception的框架,我们可以采用一种非常简单.直

[翻译]JDK 8 兼容性指南

翻译官方文档,删除部分可忽略. 译者:坤谷,井桐,激酶 兼容性是一个复杂的问题. 本文介绍了Java平台潜在的三种不兼容问题: 源码: 源码兼容性问题关注Java源代码转换成class文件是否兼容,包括代码是否仍然可编译. 二进制: 在Java语言规范中,二进制兼容性定义为:"类的改变是二进制兼容的(或者不破坏二进制兼容性),是指如果改变前的类的二进制在链接时没有错误,那么改变后的类在链接时仍然没有错误." 行为 : 行为兼容性包括在运行时执行的代码的语义. 欲了解更多信息,请参阅Op

C#:Web Service异常处理

web|异常处理 在.Net中实现Web服务时,在Web服务接口中产生的任何用户异常(非SoapException之外的异常)都被包装为SoapException传递给客户端,这使得难以采用通常的方式处理Web Service的异常.本文讲述如何通过SoapExceptionHelper实现一致的异常处理. Web Service的异常处理问题在.Net中实现Web服务时,Web服务接口中产生的任何用户异常(非SoapException之外的异常)都被包装为SoapException传递给客户端

spring提供的事务管理

spring提供的事务管理可以分为两类:编程式的和声明式的.编程式的,比较灵活,但是代码量大, 存在重复的代码比较多:声明式的比编程式的更灵活.编程式主要使用transactionTemplate.省略了部 分的提交,回滚,一系列的事务对象定义,需注入事务管理对象:声明式:主要使用 TransactionProxyFactoryBean,围绕Poxy的动态代理,能够自动的提交和回滚事务.统观spring事务, 围绕着两个核心PlatformTransactionManager和Transacti