问题描述
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对象}