aop组件 python_【微服务No.3】AOP组件ASPectCore简单使用

本文介绍了AspectCore,一个跨平台的AOP框架,支持方法拦截、DI集成、Web应用及数据验证。通过实例展示了如何使用ErrorCommandAttribute进行错误处理,并演示了如何动态拦截和调用公共方法。
摘要由CSDN通过智能技术生成

介绍:

AspectCore是.NET标准的基于AOP的跨平台框架【github解释】。主要支持:对方面拦截器,依赖注入集成,Web应用程序,数据验证等的核心支持。

使用实例:

首先安装dll:

Install-Package AspectCore.Core

引用完dll就可以使用了,我们来创建基本的处理类:ErrorCommandAttribute

介绍就不说了,理论我也知道的不多,直接上代码:

classErrorCommandAttribute : AbstractInterceptorAttribute

{string_mess;public ErrorCommandAttribute(stringmethon)

{

_mess=methon;

}///

///每个被拦截的方法中执行///

///

///

///

public override asyncTask Invoke(AspectContext context, AspectDelegate next)

{try{

Console.WriteLine("AddAsync方法开始前");await next(context); //执行被拦截的方法

}catch(Exception)

{

Console.WriteLine("AddAsync方法出错");try{//Type[] mytypes = Assembly.GetExecutingAssembly().GetTypes();

Type type= typeof(User);//user 是类

var methom = Activator.CreateInstance(type);//反射创建类

MethodInfo methodinfo = type.GetMethod(_mess);//获取方法 _mess参数是自定义字符串为方法名称

methodinfo.Invoke(methom, null);//运行方法

}catch(Exception ex)

{throw;

}throw;

}finally{

Console.WriteLine("AddAsync方法结束");

}

}

}

View Code

只简单介绍下方法的形式:Invoke

该方法是继承AbstractInterceptorAttribute类之后必须实现得类;

然后try:是在方法执行之前执行;所有我们在检测方法开始之前要想做一些操作可以写在这里

catch:只有在检测的方法出现异常才会执行;这里是检测方法出异常了,需要做的操作,

finally:都会执行

我们再来看一下方法类:user

public classUser

{

[ErrorCommand("Error1")]public virtual async TaskAddAsync()

{

Console.WriteLine("开始方法:AddAsync");throw new Exception("出错了");return 0;

}public async TaskError1()

{

Console.WriteLine("开始方法:Error1");return 1;

}

}

View Code

很明显我们写的特性类只需要在需要检测的方法上面加特性就好了。这里特别注意就是,需要加特性的方法必须是虚方法,也就是必须加virtual 修饰。不然不会被调用。

最后看一下如何使用方法:

static void Main(string[] args)

{

Console.WriteLine("开始程序");//User user = new User();//user.AddAsync();

ProxyGeneratorBuilder proxyGeneratorBuilder = newProxyGeneratorBuilder();using (IProxyGenerator proxyGenerator =proxyGeneratorBuilder.Build())

{

User p= proxyGenerator.CreateClassProxy();

p.AddAsync();

}

Console.ReadLine();

}

View Code

与正常的使用类方法看出来了:我们new User类的时候不是传统的方式,必须使用组件的CreateClassProxy方法;

2018-06-23:

修改拦截器方法:

拦截方法从指定类型扩展为公共方法,自定义类型,这样就可以单独提取出来,不用每一个类型写一个类,可以自动获取到类型,然后可以重复使用:

public override asyncTask Invoke(AspectContext context, AspectDelegate next)

{try{

Console.WriteLine("AddAsync方法开始前");await next(context); //执行被拦截的方法

}catch(Exception)

{

Console.WriteLine("AddAsync方法出错");//重复调用示例

ProxyGeneratorBuilder proxyGeneratorBuilder = newProxyGeneratorBuilder();using (IProxyGenerator proxyGenerator =proxyGeneratorBuilder.Build())

{var baseClass =context.Proxy;foreach (var item inbaseClass.GetType().GetMethods())

{if (item.Name.ToString() ==_mess)

{

MethodInfo methodinfo=baseClass.GetType().GetMethod(_mess);

methodinfo.Invoke(baseClass,null);

}

}

}throw;

}finally{

Console.WriteLine("AddAsync方法结束");

}

}

系列目录:

微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值