轻量级的.NET对象查找服务和AOP开发框架Netop.Core源码解说(4)--AOP

上节谈了谈类工厂/对象查找服务,本节谈谈AOP的实现。

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

Netop.Core的AOP采用代理的实现方式。采用代理方式,您的类就必须继承一个基类(当然不是那个默认的Object,如您的类已经有一个父类,那可以让那个类的父类去继承)--

ContextBoundObject或Netop.Core.Aspect.AspectObject。当然Netop.Core.Aspect.AspectObject就是继承ContextBoundObject的。

Netop.Core的AOP处理建议接口

//AOP前处理建议

public interface IBeforeAdvisor : IAspect

{

void PreProcess(IMessage msg);

}

//AOP后处理建议

public interface IAfterAdvisor : IAspect

{

void PostProcess(IMethodReturnMessage msg);

}

//AOP异常建议(实际上就是后处理接口)

public interface IExceptionAdvisor : IAfterAdvisor

{

}

//AOP前/后均处理建议

public interface IAroundAdvisor : IBeforeAdvisor, IAfterAdvisor

{

}

Netop.Core的AOP的代理类为是继承RealProxy的Netop.Core.Aspect.AspectProxy,它要重写IMessage Invoke(IMessage msg)方法。这里顺便提一下,远程服务就是重写

RealProxy的IMessage Invoke(IMessage msg)方法实现的。当然这也是实现AOP的一种方式。

上面提了一下接口和代理类,下面先讲讲配置。还记得Netop.Core的类工厂/对象查找服务的配置吗?

<Application.ObjectLocator>

<DefaultAppObjectLocatorService>Netop.Core.LocatorService.DefaultAppObjectLocatorService,Netop.Core</DefaultAppObjectLocatorService>

<ObjectServiceAgentName>AppObjectService</ObjectServiceAgentName>

<AspectAgentName>AppAspect</AspectAgentName>

</Application.ObjectLocator>

<Application.Agent>

<Agent name="AppObjectService" type="Netop.Core.Configuration.FileAgentConfiguration,Netop.Core">

<File>Service.xml</File>

</Agent>

<Agent name="AppAspect" type="Netop.Core.Configuration.FileAgentConfiguration,Netop.Core">

<File>Aspect.xml</File>

</Agent>

</Application.Agent>

</Application.ObjectLocator>

<AspectAgentName>AppAspect</AspectAgentName>是配置AOP服务的,AppAspect名称对应于Application.Agent下节点Agent name="AppAspect"的信息:

<Agent name="AppAspect" type="Netop.Core.Configuration.FileAgentConfiguration,Netop.Core">

<File>Aspect.xml</File>

</Agent>

查看AspectConfiguration.cs文件内容,AppAspectConfigurationManager类通过调用AppObjectLocatorConfigurationManager.Current.AspectAgentName获得AspectAgentName

对应的配置代理名称,再通过调用配置代理服务得到Aspect.xml的内容。如测试程序Aspect.xml的内容为:

<Application.Aspect>

<Object name="A0" type="Test.Core.MyAdvisor,Test.Core"
isSingleton = "true" pointcut="Construction|Method|Property"
match="*,He*,*"/>

</Application.Aspect>

name:拦截器名,没有特别的含义,只要唯一就行;

type:拦截器类的全名;

isSingleton:此拦截器是否为单例,值为"true"或"1"或"yes",则为单例. 单例时可提高性能,不设置时默认为单例;

pointcut:拦截的类型,有三种:方法(Method)、构造函数(Construction)和属性(Property);多种组合用“|”隔开。

Match:匹配规则。可对类名,方法,属性定义规则。类名,方法,属性三者的规则之间用","隔开。如match="*,Get*,*"中,类名的匹配在第一个逗号前为"*",方法的匹配在第二

个逗号前为"Get*",属性的匹配在第二个逗号后为"*"。

类名的匹配:符合正则表达式匹配为真时的类;

方法的匹配:如pointcut中无Method则均不匹配; 如pointcut中有Method则为符合正则表达式匹配为真时的方法.

属性的匹配:如pointcut中无Property则均不匹配;如pointcut中有Property则为符合正则表达式匹配为真时的属性.

讲清楚了基本配置,通过测试程序来说明使用和源码解说:

namespace Test.Core

{

public interface IService : IDisposable

{

void Hello();

}

public class Service3 : AspectObject, IService

{

public void Hello()

{

Console.WriteLine("");

Console.WriteLine("Do3 begin");

Console.WriteLine("Do3 ...");

Console.WriteLine(this.GetType().FullName);

Console.WriteLine("Do3 end");

Console.WriteLine("");

}

public void Dispose()

{

Console.WriteLine("Service3:Dispose");

}

}

public class MyAdvisor : IAroundAdvisor

{

public void PreProcess(IMessage msg)

{

Console.WriteLine("PreProcess ...");

}

public void PostProcess(IMethodReturnMessage msg)

{

Console.WriteLine("PostProcess ...");

}

}

}

类Service3继承了AspectObject,拦截器类为MyAdvisor,实现了IAroundAdvisor的方法。

Aspect.xml对拦截器类MyAdvisor进行配置:

<Application.Aspect>

<Object name="A0" type="Test.Core.MyAdvisor,Test.Core" isSingleton =
"true" pointcut="Construction|Method|Property" match="*,He*,*"/>

</Application.Aspect>

Service.xml对类Service3进行配置:

<Application.ObjectService>

<Object name="A3" type="Test.Core.Service3,Test.Core" isAspect="1">

</Object>

</Application.ObjectService>

注意:增加了isAspect属性,值为"true"或"1"或"yes"时为才可能激活AOP服务通道(进入了这个通道后,真正是否执行还要看拦截器配置的匹配问题)。

当执行IService s3 =
Netop.Core.LocatorService.AppObjectLocatorManager.GetObject("A3")  as 
IService 时调用了DefaultAppObjectLocatorService的GetObject的方法

,当发现"A3"(Service3)的isAspect为真时,并且Service3类是继承于Netop.Core.Aspect.AspectObject(MarshalByRefObject)的,将获取一个透明代理,

DefaultAppObjectLocatorService相关的代码为:

o = TypeUtil.CreateInstance(t);

if (os.IsAspect)

{

if (o is MarshalByRefObject)

{

RealProxy realProxy = new AspectProxy(t, (MarshalByRefObject)o);

o = realProxy.GetTransparentProxy() as MarshalByRefObject;

}

}

通过自定义的RealProxy创建TransparentProxy供客户端代码调用,对于通过TransparentProxy的每一次调用,都会被RealProxy接管,这样我们在RealProxy中Invoke方法加入

的相关代码在每次调用方法时都会被调用。

AspectProxy中Invoke方法的代码就不一一细说了,主要逻辑是先获得匹配的拦截器,然后进行前处理、消息本身的处理、后处理等动作。

上面讲的激活AOP服务通道是设置isAspect属性,这是比较灵活的一种:

<Application.ObjectService>

<Object name="A3" type="Test.Core.Service3,Test.Core" isAspect="1">

</Object>

</Application.ObjectService>

另一种很不灵活的方法是不在Service.xml进行配置,而是在对应类加特性AspectAttribute,如:

[AspectAttribute]

public class Service3 : AspectObject, IService

{

public void Hello()

{

Console.WriteLine("");

Console.WriteLine("Do3 begin");

Console.WriteLine("Do3 ...");

Console.WriteLine(this.GetType().FullName);

Console.WriteLine("Do3 end");

Console.WriteLine("");

}

public void Dispose()

{

Console.WriteLine("Service3:Dispose");

}

}

这是一种选择,但不建议这样使用。感兴趣的可以看看AspectAttribute代码。

Netop.Core的AOP能很好与对象查找服务集成在一起,代码也简单,实现了微量级的目标。

轻量级的.NET对象查找服务和AOP开发框架源码Netop.Core3.5下载地址:http://download.csdn.NET/detail/tom_cat_xie_jxdy/9837303

轻量级的.NET对象查找服务和AOP开发框架测试源码 下载地址:http://download.csdn.Net/detail/tom_cat_xie_jxdy/9837278

Netop.Core--轻量级的.NET对象查找服务和AOP开发框架文档下载地址:http://download.csdn.net/detail/tom_cat_xie_jxdy/9838212

时间: 2024-11-08 03:28:13

轻量级的.NET对象查找服务和AOP开发框架Netop.Core源码解说(4)--AOP的相关文章

轻量级的.NET对象查找服务和AOP开发框架Netop.Core源码解说(2)--配置

先把Netop.Core的最核心部分"对象查找服务"放一放,先说说应用系统的配置. 一个应用系统的配置是少不了的,除非你是一个纯硬代码族顽固者. 也见过有的应用系统通过系统提供的健值(key-value)方法在appSettings节点下设了几十个甚至上百个,不堪入目,更别说条理性了. 开发一个应用框架,配置一般是少不了,如log4net就有自己的配置,不会让你在appSettings设几十个条目. 开发配置是很简单的,下面慢慢说来. 在NET应用中,配置信息以XML文档储存.WEB应

轻量级的.NET对象查找服务和AOP开发框架Netop.Core源码解说(1)-导言

Netop.Core是我程序开发积累的一个轻量级的.NET对象查找服务和AOP开发框架,现将源码公开,共享给各位NET程序员后面相关的文章对这个开发框架进行程序解说和使用解说. Netop.Core--轻量级的.NET对象查找服务和AOP开发框架概述:1.    对象查找服务(本地服务实例生成,远程服务,WCF服务)和AOP服务.2.    其它普通服务:配置, 对话上下文,日志,缓冲等.3.    类库:Netop.Core.dll  4.    必需的外部类库:Microsoft.Pract

轻量级的.NET对象查找服务和AOP开发框架Netop.Core源码解说(3)--类工厂/对象查找服务

上节谈了谈Netop.Core的对于应用系统的配置信息的处理,对于Netop.Core最核心的服务--类工厂/对象查找服务当然要用到配置服务,等下会说到. 对于NET类工厂/对象查找服务,名气大的有Spring.Net(对应于Java的Spring--号称轻量级中间件),为什么还要再造一个轮子呢?如果说Spring是轻量级的,那Netop.Core就只 能是微量级的,够用就好,学习曲线会大幅下降,学习研究代码的时间也会大幅下降. 够用就好,何乐而不为?况且Netop.Core的类工厂/对象查找服

轻量级的.NET对象查找服务和AOP开发框架Netop.Core源码解说(5)--其它

Netop.Core主要提供的服务是类工厂服务及AOP服务,当然还其它一些小服务: 一.对话上下文Netop.Core.Context.SessionContext       此对话上下文可用在桌面程序和ASP.NET程序,可用SetData和GetData在上下文中传递数据.方法有:       public static bool IsWeb()       public static string GetAppMapPath (string path)       public stat

Spring核心框架 - AOP的原理及源码解析

一.AOP的体系结构 如下图所示:(引自AOP联盟) 层次3语言和开发环境:基础是指待增加对象或者目标对象:切面通常包括对于基础的增加应用:配置是指AOP体系中提供的配置环境或者编织配置,通过该配置AOP将基础和切面结合起来,从而完成切面对目标对象的编织实现. 层次2面向方面系统:配置模型,逻辑配置和AOP模型是为上策的语言和开发环境提供支持的,主要功能是将需要增强的目标对象.切面和配置使用AOP的API转换.抽象.封装成面向方面中的逻辑模型. 层次1底层编织实现模块:主要是将面向方面系统抽象封

【Spring源码分析】AOP源码解析(上篇)

前言 前面写了六篇文章详细地分析了Spring Bean加载流程,这部分完了之后就要进入一个比较困难的部分了,就是AOP的实现原理分析.为了探究AOP实现原理,首先定义几个类,一个Dao接口: 1 public interface Dao { 2 3 public void select(); 4 5 public void insert(); 6 7 } Dao接口的实现类DaoImpl: 1 public class DaoImpl implements Dao { 2 3 @Overrid

leaflet结合geoserver利用WFS服务实现图层删除功能(附源码下载)

前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet 的插件库,非常有用 内容概览 leaflet结合geoserver利用WFS服务实现图层删除源代码demo下载 效果图如下: 本篇主要是在上一篇leaflet结合geoserver利用WFS服务实现图层新增功能(附源码下载)基础上实现的,leaflet通过调用geoserver发布的地图服务WFS来

openlayers6结合geoserver利用WFS服务实现图层删除功能(附源码下载)

内容概览 1.openlayers6结合geoserver利用WFS服务实现图层删除功能2.源代码demo下载 效果图如下: 本篇主要是在上一篇openlayers6结合geoserver利用WFS服务实现图层新增功能(附源码下载)基础上实现的,openlayers6通过调用geoserver发布的地图服务WFS来达到图层删除记录的目的.与GeoServer的WFS进行基于Rest交互关键就在于请求参数,值得注意的是这些请求最好采用POST方法发送.查询可以采用json,但增加,删除,修改都只能

C#版Windows服务安装卸载小工具-附源码

前言 在我们的工作中,经常遇到Windows服务的安装和卸载,在之前公司也普写过一个WinForm程序选择安装路径,这次再来个小巧灵活的控制台程序,不用再选择,只需放到需要安装服务的目录中运行就可以实现安装或卸载. 开发思路 1.由于系统的权限限制,在运行程序时需要以管理员身份运行 2.因为需要实现安装和卸载两个功能,在程序运行时提示本次操作是安装还是卸载  需要输入 1 或 2 3.接下来程序会查找当前目录中的可执行文件并过滤程序本身和有时我们复制进来的带有vhost的文件,并列出列表让操作者