动态代理 DynamicProxy,这里说的动态代理是直接使用Castle.net 中提供的,并非自己实现的,在项目早期自己尝试过创建一个自己的动态代理类,虽然能够实现,但是功能上还是太弱了一些,如果追加功能就变得和Castle.net 的一样了,所以就直接采用人家的了。。。
=============咯咯咯=============
动态代理的工作模式:
一般我们获取一个类型的实例都是通过 new 关键字,例如 var c = new Class1(); 通过动态代理的话,我们获取一个实例是通过代理方法获取的,generator.CreateClassProxy(type,interceptor); 其中Type是要代理的类型,也就是Class1(); interceptor则是实际执行代理的拦截器。
为什么我们要这么麻烦的使用代理而不是直接new实例?
简单的说,例如我Class1与Class2都有自己的方法,我现在想给这两给类的每个方法都添加一个日志操作,如果不通过代理我们怎么做呢?每个函数开始增加一句Log.Enter();结束的时候增加一个Log.Exit(); 如果涉及到TryCatch这类的,会更麻烦。通过动态代理,我们可以增加一个拦截器,拦截器中,可以先执行Log.Enter();然后执行实际操作,最后在执行Log.Exit(); ?这样我们就不需要去修改 Class1与Class2两个类。
在这个项目里,动态代理有两个功能,一个是将客户端与服务端分离,另一个是提供日志代理。日志代理上面已经说了,现在说怎么实现客户端与服务端的分离。
在客户端调用服务端的服务时,我们一般会采用WCF,WebService之类的服务提供者,但是我们的项目比较特殊,他的客户可能会要求使用客户端与服务端分离,也有可能要求他们一起部署,及最简单的所有的东西都在一起,看上去是一个大个的客户端。
所以在开发的时候,要求客户端程序员,不能直接new出任何服务,所有的服务必须通过GetService获取,这样,根据客户的要求来实现分离或者整合,因为所有的操作都是在动态代理中执行的,所以只需要将动态代理的代理结果交给Communication组件既可以完成。
=========Communication===========
Communication组件是基本组件之一,负责执行动态代理传递过来的结果,其接口有两个方法:
- ??
- ??
- ??
- ??
- ??
- object?Execute(String?method,?Object?parameter);??
- ??
- ??
- ??
- ??
- void?AsycExecute(String?method,?Object?parameter,?Delegate?Continue);??
通过这两个方法的具体执行内容的变换,就可以替换为不同的服务端操作了。
==============DynamicProxy=======================
部分动态代理的代码:
拦截器(ServiceInterceptor):
- ??
- ??
- ??
- public?class?ServiceInterceptor?:?IInterceptor??
- {??
- ??????
- ??????
- ??????
- ????public?Action<Object>?BeforeMethod?{?get;?set;?}??
- ??????
- ??????
- ??????
- ????public?Action<Object>?AfterMethod?{?get;?set;?}??
- ??????
- ??????
- ??????
- ????public?Object?BeforeMethodParameter?{?get;?set;?}??
- ??????
- ??????
- ??????
- ????public?Object?AfterMethodParameter?{?get;?set;?}??
- ??????
- ??????
- ??????
- ????public?Func<String,?Object,?Object>?InterfaceInvoke?{?get;?set;?}??
- ??
- ??????
- ??????
- ??????
- ????public?Action<String,?Delegate>?AsycInterfaceInvoke?{?get;?set;?}??
- ??
- ??????
- ??????
- ??????
- ????public?Delegate?Continue?{?get;?set;?}??
- ??
- ??????
- ??????
- ??????
- ????public?bool?IsInterface?{?get;?set;?}??
- ??
- ??????
- ??????
- ??????
- ????public?void?Intercept(IInvocation?invocation)??
- ????{??
- ??????????
- ????????if?(BeforeMethod?!=?null)??
- ????????{??
- ????????????BeforeMethod(BeforeMethodParameter);??
- ????????}??
- ??
- ????????if?(IsInterface)??
- ????????{??
- ??????????????
- ????????????if?((InterfaceInvoke?!=?null?||?AsycInterfaceInvoke?!=?null)??
- ????????????????&&?invocation.Method.DeclaringType?!=?null)??
- ????????????{??
- ??????????????????
- ????????????????if?(Continue?==?null)??
- ????????????????{??
- ??????????????????????
- ????????????????????invocation.ReturnValue?=?InterfaceInvoke(String.Format("{0}.{1}",?invocation.Method.DeclaringType.FullName,?invocation.Method.Name),?invocation.Arguments);??
- ????????????????}??
- ????????????????else??
- ????????????????{??
- ??????????????????????
- ????????????????????AsycInterfaceInvoke(String.Format("{0}.{1}",?invocation.Arguments,?Continue);??
- ????????????????}??
- ????????????}??
- ????????}??
- ????????else??
- ????????{??
- ????????????invocation.Proceed();??
- ????????}??
- ??
- ??????????
- ????????if?(AfterMethod?!=?null)??
- ????????{??
- ????????????AfterMethod(AfterMethodParameter);??
- ????????}??
- ????}??
- }??
DynamicProxy 类:
- ??
- ??
- ??
- public?static?class?DynamicProxy??
- {??
- ??????
- ??????
- ??????
- ????public?static?ILog?Logger?{?get;?set;?}??
- ??
- ??????
- ??????
- ??????
- ????public?static?Func<String,?Object>?InterfaceInvoke?{?get;?set;?}??
- ??
- ??????
- ??????
- ??????
- ????public?static?Action<String,?Delegate>?AsycInterfaceInvoke?{?get;?set;?}??
- ??
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ????public?static?Object?GetInstance(String?typeName,?Action<Object>?beforeMethod,?Action<Object>?afterMethod,??
- ???????????????????????????????????Object?beforeMethodParameter?=?null,?Object?afterMethodParameter?=?null)??
- ????{??
- ????????var?assemblies?=?AppDomain.CurrentDomain.GetAssemblies();??
- ??
- ????????Type?type?=?null;??
- ????????foreach?(var?assembly?in?assemblies)??
- ????????{??
- ????????????type?=?assembly.GetType(typeName);??
- ????????????if?(type?!=?null)?break;??
- ????????}??
- ??
- ????????return?CreateInstance(beforeMethod,?afterMethod,?beforeMethodParameter,?afterMethodParameter,?type);??
- ??
- ????}??
- ??
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ????private?static?object?CreateInstance(Action<object>?beforeMethod,?Action<object>?afterMethod,??
- ?????????????????????????????????????????object?beforeMethodParameter,?object?afterMethodParameter,?Type?type)??
- ????{??
- ????????if?(type?==?null)?return?null;??
- ??
- ????????ProxyGenerator?generator?=?new?ProxyGenerator();??
- ????????var?interceptor?=?new?ServiceInterceptor??
- ????????{??
- ????????????AfterMethod?=?afterMethod,??
- ????????????AfterMethodParameter?=?afterMethodParameter,??
- ????????????BeforeMethod?=?beforeMethod,??
- ????????????BeforeMethodParameter?=?beforeMethodParameter,??
- ????????????InterfaceInvoke?=?InterfaceInvoke,??
- ????????????IsInterface?=?type.IsInterface,??
- ????????????AsycInterfaceInvoke?=?AsycInterfaceInvoke??
- ????????};??
- ??
- ????????if?(type.IsInterface)??
- ????????{??
- ????????????return?generator.CreateInterfaceProxyWithoutTarget(type,?interceptor);??
- ????????}??
- ??
- ????????return?generator.CreateClassProxy(type,?interceptor);??
- ????}??
- ??
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ??????
- ????public?static?T?GetInstance<T>(Action<Object>?beforeMethod,??
- ???????????????????????????????????Object?beforeMethodParameter?=?null,?Object?afterMethodParameter?=?null)??
- ????{??
- ????????Type?type?=?typeof(T);??
- ????????return?(T)CreateInstance(beforeMethod,?type);??
- ????}??
- ??
- ??????
- ??????
- ??????
- ??????
- ??????
- ????public?static?T?GetLogInstance<T>()??
- ????{??
- ????????return?GetInstance<T>(Logger.CallLog,?Logger.CallLog);??
- ????}??
MethodCommunication类,该类中直接执行委托的方法,不区分客户端与服务端:
WCF与其他的?ICommunication类这里就不给出了,基本上都是差不多的。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|