AOP(面向方面编程),当面向对象遭遇业务的全面需求时候(最常被用来举例的需求就是业务的需要权限验证,与钱相关模块和财务挂钩) ,面向对象有些力不从心,这时候会出现aop出来救苦难于水火的程序员。
WebSharp 是个不太出名的轻量级的.net框架包括了ORM,AOP 等开源软件。由http://www.uml.org.cn 在支撑着。
(欢迎有兴趣的人去下载咯)简单的框架对我们这些菜鸟的好处就是,看起来能简单些,虽然我们还有很多不懂,由于代码少点所以要照顾的地方少些,痛苦就少点。
下面我就说说websharp的AOP吧 ,先从间简单的说吧,把我理解的先说吧 。(是不是犯法我就不知道了,如果是给我发个邮件吧,跟我索赔 我不到三千的工资,养我自己还不够 )。
1.首先 AOP也就是拦截,注入咯。注入的时间无非是三种 执行前,执行后,前后都注入 。所以我们定义了注入类型 (enum)
public enum InjectPosition
{
Before,
After,
Both
}
2.前后我们做些什么事情 这些事情用函数来表达咯,所以就定义了接口,对于以后要参加影响别人的类都要继承这个的接口IAspect 两个方法 Pre,Post.
public interface IAspect
{
void PreProcess(IMessage message);

void PostProcess(IMessage message);
}
3..net的AOP基本上都是靠System.Runtime.Remoting空间下的类库来解决咯 ,这个类库下面的类起的名字怪怪的(关键是自己的英语差 ),所以看起来也没有多大兴趣。
要被注入的类都要继承 类 ContextBoundObject ,原因是他支持上下文绑定
websharp 这样做的
public abstract class AspectObject : ContextBoundObject
{
}
4.要使对象受影响 那就的给他加个Attribute 靠反射了。高手们都说反射的性能差,我还不知道他们是怎么干活的
所以定义了属性AspectManageAttribute 继承了ProxyAttribute (他们太强了 这个都知道)
[AttributeUsage(AttributeTargets.Class)]
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure)]
public class AspectManageAttribute : ProxyAttribute
{
private bool aspectManaged;

public AspectManageAttribute()
{ }

public AspectManageAttribute(bool isAllow)
{
aspectManaged = isAllow;
}

public override MarshalByRefObject CreateInstance(Type serverType)
{
MarshalByRefObject mobj = base.CreateInstance(serverType);
MarshalByRefObject retobj = null;
if (aspectManaged)
{
RealProxy realProxy = new AspectProxy(serverType, mobj);
retobj = realProxy.GetTransparentProxy() as MarshalByRefObject;
}
return retobj;
}
重要的这个重写的方法。
剩下的以后再写
WebSharp 是个不太出名的轻量级的.net框架包括了ORM,AOP 等开源软件。由http://www.uml.org.cn 在支撑着。
(欢迎有兴趣的人去下载咯)简单的框架对我们这些菜鸟的好处就是,看起来能简单些,虽然我们还有很多不懂,由于代码少点所以要照顾的地方少些,痛苦就少点。
下面我就说说websharp的AOP吧 ,先从间简单的说吧,把我理解的先说吧 。(是不是犯法我就不知道了,如果是给我发个邮件吧,跟我索赔 我不到三千的工资,养我自己还不够 )。
1.首先 AOP也就是拦截,注入咯。注入的时间无非是三种 执行前,执行后,前后都注入 。所以我们定义了注入类型 (enum)
public enum InjectPosition
{
Before,
After,
Both
}2.前后我们做些什么事情 这些事情用函数来表达咯,所以就定义了接口,对于以后要参加影响别人的类都要继承这个的接口IAspect 两个方法 Pre,Post.
public interface IAspect
{
void PreProcess(IMessage message);
void PostProcess(IMessage message);
}要被注入的类都要继承 类 ContextBoundObject ,原因是他支持上下文绑定
websharp 这样做的
public abstract class AspectObject : ContextBoundObject
{
}所以定义了属性AspectManageAttribute 继承了ProxyAttribute (他们太强了 这个都知道)
[AttributeUsage(AttributeTargets.Class)]
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure)]
public class AspectManageAttribute : ProxyAttribute
{
private bool aspectManaged;
public AspectManageAttribute()
{ }
public AspectManageAttribute(bool isAllow)
{
aspectManaged = isAllow;
}
public override MarshalByRefObject CreateInstance(Type serverType)
{
MarshalByRefObject mobj = base.CreateInstance(serverType);
MarshalByRefObject retobj = null;
if (aspectManaged)
{
RealProxy realProxy = new AspectProxy(serverType, mobj);
retobj = realProxy.GetTransparentProxy() as MarshalByRefObject;
}
return retobj;
}剩下的以后再写
本文介绍了WebSharp框架中AOP(面向切面编程)的实现原理与使用方法。通过.NET平台上的System.Runtime.Remoting类库,实现了方法执行前后的拦截与注入。详细解释了AspectManageAttribute的作用及其实现细节。
1399

被折叠的 条评论
为什么被折叠?



