【微服务No.3】AOP组件ASPectCore简单使用
介绍:
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方法结束");
}
}
}
只简单介绍下方法的形式:Invoke
该方法是继承AbstractInterceptorAttribute类之后必须实现得类;
然后try:是在方法执行之前执行;所有我们在检测方法开始之前要想做一些操作可以写在这里
catch:只有在检测的方法出现异常才会执行;这里是检测方法出异常了,需要做的操作,
finally:都会执行
我们再来看一下方法类:user
public class User
{
[ErrorCommand("Error1")]
public virtual async Task<int> AddAsync()
{
Console.WriteLine("开始方法:AddAsync");
throw new Exception("出错了");
return ;
}
public async Task<int> Error1()
{
Console.WriteLine("开始方法:Error1");
return ;
}
}
很明显我们写的特性类只需要在需要检测的方法上面加特性就好了。这里特别注意就是,需要加特性的方法必须是虚方法,也就是必须加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方法;
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方法结束");
}
}
系列目录:
微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:
- 微服务——微服务的介绍和目录
- 微服务——【Consul】服务发现在windows下简单使用(一)
- 微服务——【polly】微服务故障处理库(二)
- 微服务——动态代理AspectCore的使用(三)
- 微服务——网关Ocelot+Consul实现集群轮询(四)
【微服务No.3】AOP组件ASPectCore简单使用的更多相关文章
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- SpringCloud微服务:基于Nacos组件,整合Dubbo框架
源码地址:GitHub·点这里 || GitEE·点这里 一.基础组件简介 1.Dubbo框架 Dubbo服务化治理的核心框架,之前几年在国内被广泛使用,后续由于微服务的架构的崛起,更多的公司转向微服 ...
- SpringCloud微服务(03):Hystrix组件,实现服务熔断
本文源码:GitHub·点这里 || GitEE·点这里 写在前面:阅读本文前,你可能需要熟悉一下内容. 微服务组件:Eureka管理注册中心 微服务组件:Ribbon和Feign服务调用 Sprin ...
- springCloud 微服务框架搭建入门(很简单的一个案例不喜勿扰)
Spring cloud 实现服务注册及发现 服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务. clou ...
- 【微服务架构】SpringCloud组件和概念介绍(一)
一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ...
- SpringCloud微服务(07):Zipkin组件,实现请求链路追踪
本文源码:GitHub·点这里 || GitEE·点这里 一.链路追踪简介 1.Sleuth组件简介 Sleuth是SpringCloud微服务系统中的一个组件,实现了链路追踪解决方案.可以定位一个请 ...
- SpringCloud微服务(05):Zuul组件,实现路由网关控制
本文源码:GitHub·点这里 || GitEE·点这里 一.Zuul组件简介 1.基础概念 Zuul 网关主要提供动态路由,监控,弹性,安全管控等功能.在分布式的微服务系统中,系统被拆为了多个微服务 ...
- SpringCloud微服务(04):Turbine组件,实现微服务集群监控
本文源码:GitHub·点这里 || GitEE·点这里 写在前面,阅读本文前,你需要了解熔断器相关内容 SpringCloud微服务:Hystrix组件,实现服务熔断 一.聚合监控简介 1.Dash ...
- SpringCloud微服务:阿里开源组件Nacos,服务和配置管理
源码地址:GitHub·点这里||GitEE·点这里 一.阿里微服务简介 1.基础描述 Alibaba-Cloud致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开 ...
随机推荐
- 项目小程序笔记-登录界面+FPGA管脚分配文件生成
声明:只是为了记录我遇到的一些问题,其中有我理解错的望勿参考. (1)qt designer设计好窗口 主窗口: 登录窗口: 关于qt designer的使用,大可以百度,很简单的,要注意的是部件的参 ...
- Linux-系统编程-知识点概述
1.基本指令和5个背景知识(os.env.file.shell.权限) 2.开发环境:(vim.gcc.g++.gdb.ctags.make.Makefile.procbar) 3.进程1: 进程的基 ...
- Android-Java-普通类与抽象类(覆盖)&方法重载
覆盖都是子类与父类之间 & 接口与实现类之间 才会产生:覆盖 有很多名称,覆盖,复写,重写 都是一个意思: 注意:重载都是方法之间 方法同名 不同参数,就属于重载: 普通类-覆盖: 描述An ...
- UICollectionView添加 HeaderView FooterView
UICollectionView显示HeaderView FooterView 不如UITableView那么容易,常用会有两种做法: 1.Xib或者Storyboard 在属性一栏中设置一下: 如图 ...
- 如何解决微信小程序界面适配问题-引用-生命周期回调函数-优化机制-样式引入
如何解决微信小程序界面适配问题 .wxss page{ height: 100%; width:750rpx; } this.setData({ imageWidth: wx.getSystemInf ...
- ajax jsonp请求报错not a function的解决方案
概述 最近工作中使用ajax,有时会报json4 is not a function的错误,有时又不会报错.找了很久,网上说是因为多次请求同一个资源导致的,但是我检查了自己的代码,对于重复资源并没有重 ...
- input在ios safari中的内阴影解决方法
最近发现 input 在 ios的 safari浏览器里显示时,会默认有内阴影,如下图 解决方法: input { -webkit-appearance: none; } -webkit-appear ...
- LabVIEW(九):程序结构中的分支结构和顺序结构
一.分支结构 1.创建分支结构:程序框图右键>结构>条件结构 2.Ctrl + I 会显示错误列表,双击错误列表会定位到该错误在程序框图中地方. 3.有的分支可以不连接分支内容. 在不连接 ...
- Oracle优化器基础知识之访问数据的方法
目录 一.访问数据的方法 1.直接访问数据 2.访问索引 一.访问数据的方法 Oracle访问表中数据的方法有两种,一种是直接表中访问数据,另外一种是先访问索引,如果索引数据不符合目标SQL,就回表, ...
- [原创]IIS提权工具-VBS提权脚本免杀生成器
[原创]添加系统用户 VBS提权脚本随机加密生成器[K.8] 2011-05-05 02:42:53| 分类: 原创工具 VBS提权脚本随机加密生成器[K.8] Author: QQ吻 QQ:39 ...