AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
WCF是Microsoft为构建面向服务的应用提供的分布式通信编程框架。使用该框架,开发人员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。
一般在.net里加入拦截点有两种方法:
1. 静态织入方法,一般都是需要扩展编译器的功能,将需要织入的代码,通过修改IL代码的方法,直接添加到相应的被织入点。使用这种方式来实现AOP,其优点是代码执行的效率高,缺点是实现者需要对IL有很深的了解。
2.动态织入的方法,具体实现方式就有很多选择了。比如使用remotingproxy等。
我们在这里不使用上面两种方法,而是利用WCF服务的特性部分实现AOP。 在WCF服务中实现AOP实现权限管理,日志记录,性能检测等。
对于AOP的实现,最重要是拦截正常的方法的调用。如我们需要对WCF的服务进行日志或者权限管理,这要求我们对所有的WCF访问进行拦截。 如图:
WCF是一个极具可扩展性的分布是消息通信框架,它给我们提供了很多扩展点。这里我们就利用ParameterInspector(参数检查)的扩展来给所有的WCF服务进行拦截。
步骤:
1.编写参数检查类(MyParameterInspector)
2.编码自定义服务(MyServiceHost)
详细实现:
1.编写参数检查类
这个类要实现两个接口 IOperationBehavior, IParameterInspector。
在IParameterInspector接口中有两个方法AfterCall和BeforeCall。哈哈,我们有要这两个方法:
public object BeforeCall(string operationName, object[] inputs)
这是调用方法前,operationName为方法名称。intputs为方法调用参数。返回一个object,这个对象将传给AfterCall的correlationState。
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
这是调用方法前,operationName为方法名称。outputs为输出参数,returnValue为返回值,correlationState就是上面BeforeCall方法返回的那个ojbect.
代码如下:
在这个类里,主要实现的两个方法BeforeCall和AfterCall,这两个方法通过反射把输入和输出的参数通过控制台输出,当然你也可以写日志。也可以在这里控制访问的权限,如:在BeforeCall中,当你发现访问者没有权限时,你可抛出一个异常
throw new FaultException("你没有调用此方法的权限");
2.自定义服务
我们需要自定义一个服务将扩展点加入进去。具体代码如下:
在这里我们通过
this.Description.Endpoints[i].Contract.Operations[j].Behaviors.Add(mypi);
给所有的方法都加入的参数检查,当然你也可以通过配置文件来确认给那些方法加入参数检查。
最后就是就是启动服务了 代码如下:
调用方法结果如下:
如果你想要实现性能检测,你只需要计算两次BeforeCall和AfterCall之间的时间差就可以了。通过BeforeCall的返回值把开始时间传给AfterCall,然后在AfterCall中计算时间差。
如果你想调试,只需有建立3个文件MyParameterInspector.cs,MyServiceHost.cs,Program.cs 将上面的代码copy上去,自己建立一个WCF服务,修改Program.cs中的MyServiceHost msh = new MyServiceHost(typeof(WcfServiceLibrary.Service1 ))里的服务改成自己的服务就可以了。