介绍:html
AspectCore是.NET标准的基于AOP的跨平台框架【github解释】。主要支持:对方面拦截器,依赖注入集成,Web应用程序,数据验证等的核心支持。git
首先安装dll:github
Install-Package AspectCore.Corewindows
引用完dll就能够使用了,咱们来建立基本的处理类:ErrorCommandAttribute框架
介绍就不说了,理论我也知道的很少,直接上代码:async
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方法结束"); } } }
只简单介绍下方法的形式:Invokeide
该方法是继承AbstractInterceptorAttribute类以后必须实现得类;微服务
而后try:是在方法执行以前执行;全部咱们在检测方法开始以前要想作一些操做能够写在这里ui
catch:只有在检测的方法出现异常才会执行;这里是检测方法出异常了,须要作的操做,spa
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; } }
很明显咱们写的特性类只须要在须要检测的方法上面加特性就行了。这里特别注意就是,须要加特性的方法必须是虚方法,也就是必须加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(); }
与正常的使用类方法看出来了:咱们new User类的时候不是传统的方式,必须使用组件的CreateClassProxy方法;
拦截方法从指定类型扩展为公共方法,自定义类型,这样就能够单独提取出来,不用每个类型写一个类,能够自动获取到类型,而后能够重复使用:
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方法结束"); } }
微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例: