Remoting Discussion(三)
接着上次写的:
4.Remote端的AOP的实现
还是利用前面Remoting Infrastructure来实现的AOP框架,在自己的RealProxy里所实现的责任链(Chain of Responsibility)上,插入消息处理的Handler。那么同样的我们需要在产生对象时给它套上我们自己实现的RealProxy,并获取其TransparentProxy返回给调用者。所以对象的创建也都将通过一个工厂类来产生。我们这里是将工厂类作为Singleton方式发布出来,而Client端都是通过该远程的工厂类来产生其它的远程对象的,远程的工厂类则在Remote Server上通过反射来创建远程对象实例并返回给Client端。
我们可以通过读配置文件来动态的产生所需要切入方法的Handler,比如Log,Security等Handler都可以切人方法。在本框架里,实现了一个Exception Handler,它将在方法调用结束后处理Exception,主要就是用来解决3.Retry Route的Handler的实现中提到的Question 1。
5.路由算法的实现
框架定义了一个提供路由算法的接口,在Retry Route的Handler里,通过该接口的实例来提供路由算法。而该接口的实例则是由一个工厂来产生的。该工厂会去读取配置文件,通过配置信息反射创建实现路由算法的类的实例,并返回给Retry Route的Handler来使用。这样用户可以有很大的灵活性,来实现和设置自己想要的路由算法。如果配置文件文件中没有设置用户自己的路由算法类,那么将会使用框架里默认实现的一个UrlRouter类来提供路由算法。
6 . 待解决的问题
现在用该Library来创建的远程对象都是无状态的,所以也只支持无参数的构造。所以从用户的角度来看,所有的远程对象都会是SingleCall模式的,而无法做到Singleton和客户端激活模式,因为现在还无法跨服务器同步远程对象的状态。
解决方案:
在ASP.Net里,每一次的Post Back都会新建一个页面对象,但是通过Viewstate机制ASP.Net的框架可以让每次Post Back后新建的页面对象都恢复到之前的状态。参考ASP.Net的做法,我们可以在Client端记录远程对象的状态,然后在每次调用远程对象的方法前把Client端记录的状态恢复到新建的远程对象上。这里的难点在于如何记录和恢复远程对象的状态,因为对象的状态很有可能是一个private的成员,那么我们如何读写这个private成员呢?或许用Reflection可以做到。还有个方案 ,也可以直接在Remote端把整个远程对象二进制序列化,然后传给Client端,Client端接收到后保存在内存里;每次恢复时,Client将二进制序列化的数据再传回给Remote端,Remote端再反序列化回二进制对象。
为了实现这点,将会需要效率上付出代价。
......End......
4.Remote端的AOP的实现
还是利用前面Remoting Infrastructure来实现的AOP框架,在自己的RealProxy里所实现的责任链(Chain of Responsibility)上,插入消息处理的Handler。那么同样的我们需要在产生对象时给它套上我们自己实现的RealProxy,并获取其TransparentProxy返回给调用者。所以对象的创建也都将通过一个工厂类来产生。我们这里是将工厂类作为Singleton方式发布出来,而Client端都是通过该远程的工厂类来产生其它的远程对象的,远程的工厂类则在Remote Server上通过反射来创建远程对象实例并返回给Client端。
我们可以通过读配置文件来动态的产生所需要切入方法的Handler,比如Log,Security等Handler都可以切人方法。在本框架里,实现了一个Exception Handler,它将在方法调用结束后处理Exception,主要就是用来解决3.Retry Route的Handler的实现中提到的Question 1。
5.路由算法的实现
框架定义了一个提供路由算法的接口,在Retry Route的Handler里,通过该接口的实例来提供路由算法。而该接口的实例则是由一个工厂来产生的。该工厂会去读取配置文件,通过配置信息反射创建实现路由算法的类的实例,并返回给Retry Route的Handler来使用。这样用户可以有很大的灵活性,来实现和设置自己想要的路由算法。如果配置文件文件中没有设置用户自己的路由算法类,那么将会使用框架里默认实现的一个UrlRouter类来提供路由算法。
6 . 待解决的问题
现在用该Library来创建的远程对象都是无状态的,所以也只支持无参数的构造。所以从用户的角度来看,所有的远程对象都会是SingleCall模式的,而无法做到Singleton和客户端激活模式,因为现在还无法跨服务器同步远程对象的状态。
解决方案:
在ASP.Net里,每一次的Post Back都会新建一个页面对象,但是通过Viewstate机制ASP.Net的框架可以让每次Post Back后新建的页面对象都恢复到之前的状态。参考ASP.Net的做法,我们可以在Client端记录远程对象的状态,然后在每次调用远程对象的方法前把Client端记录的状态恢复到新建的远程对象上。这里的难点在于如何记录和恢复远程对象的状态,因为对象的状态很有可能是一个private的成员,那么我们如何读写这个private成员呢?或许用Reflection可以做到。还有个方案 ,也可以直接在Remote端把整个远程对象二进制序列化,然后传给Client端,Client端接收到后保存在内存里;每次恢复时,Client将二进制序列化的数据再传回给Remote端,Remote端再反序列化回二进制对象。
为了实现这点,将会需要效率上付出代价。
......End......