介绍:

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

使用实例:

首先安装dll:

Install-Package AspectCore.Core

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

介绍就不说了,理论我也知道的不多,直接上代码:
class ErrorCommandAttribute : AbstractInterceptorAttribute { string _mess;
public ErrorCommandAttribute(string methon) { _mess = methon; } /// <summary>
/// 每个被拦截的方法中执行 /// </summary> /// <param name="context"></param> /// <param
name="next"></param> /// <returns></returns> public override async Task
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 class User { [ErrorCommand("Error1")] public virtual async Task<int>
AddAsync() { Console.WriteLine("开始方法:AddAsync"); throw new Exception("出错了");
return 0; } public async Task<int> Error1() { Console.WriteLine("开始方法:Error1");
return 1; } } View Code
很明显我们写的特性类只需要在需要检测的方法上面加特性就好了。这里特别注意就是,需要加特性的方法必须是虚方法,也就是必须加virtual 修饰。不然不会被调用。

最后看一下如何使用方法:
static void Main(string[] args) { Console.WriteLine("开始程序"); //User user = new
User();//user.AddAsync(); ProxyGeneratorBuilder proxyGeneratorBuilder = new
ProxyGeneratorBuilder();using (IProxyGenerator proxyGenerator =
proxyGeneratorBuilder.Build()) { User p= proxyGenerator.CreateClassProxy<User>
(); p.AddAsync(); } Console.ReadLine(); } View Code
与正常的使用类方法看出来了:我们new User类的时候不是传统的方式,必须使用组件的CreateClassProxy方法;

2018-06-23:

修改拦截器方法:

拦截方法从指定类型扩展为公共方法,自定义类型,这样就可以单独提取出来,不用每一个类型写一个类,可以自动获取到类型,然后可以重复使用:
public override async Task Invoke(AspectContext context, AspectDelegate next) {
try { Console.WriteLine("AddAsync方法开始前"); await next(context); // 执行被拦截的方法 }
catch (Exception) { Console.WriteLine("AddAsync方法出错"); //重复调用示例
ProxyGeneratorBuilder proxyGeneratorBuilder =new ProxyGeneratorBuilder(); using
(IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build()) { var
baseClass = context.Proxy; foreach (var item in
baseClass.GetType().GetMethods()) {if (item.Name.ToString() == _mess) {
MethodInfo methodinfo= baseClass.GetType().GetMethod(_mess);
methodinfo.Invoke(baseClass,null); } } } throw; } finally { Console.WriteLine("
AddAsync方法结束"); } }
 

系列目录:

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

* 微服务——微服务的介绍和目录 <https://www.cnblogs.com/yanbigfeg/p/9234364.html>
* 微服务——【Consul】服务发现在windows下简单使用(一)
<http://www.cnblogs.com/yanbigfeg/p/9199590.html>
* 微服务——【polly】微服务故障处理库(二) <https://www.cnblogs.com/yanbigfeg/p/9203669.html>
* 微服务——动态代理AspectCore的使用(三) 
<https://www.cnblogs.com/yanbigfeg/p/9210158.html>
* 微服务——网关Ocelot+Consul实现集群轮询(四)
<https://www.cnblogs.com/yanbigfeg/p/9228419.html>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信