AOP实战(1)
AOP在MVC中有广泛的应用 如:IActionFilter、 IAuthenticationFilter、 IAuthorizationFilter、IExceptionFilter、IResultFilter
熟悉MVC的人对这些过滤器已经是运用自如了
下面说下在项目中如何监控自己自定义类的方法 或者接口,本文结合Autofac 做一些介绍:
这里需要几个Nuget包:
Autofac;
Castle.DynamicProxy;
Autofac.Extras.DynamicProxy;
DynamicProxy 可以监控接口以及类这里对监控接口做了一个例子:
/// <summary>
/// liyouming Add 20170914 AOP 拦截器
/// </summary> public class LoggerAttribute : IInterceptor
{ private IDAL_TbSysOperatorLog _operatorLogs; public LoggerAttribute(IDAL_TbSysOperatorLog operatorLogs)
{
_operatorLogs = operatorLogs; }
public void Intercept(IInvocation invocation)
{ var LogMethod = invocation.Method.GetCustomAttribute(typeof(LogMethodAttribute), false) as LogMethodAttribute;
if (LogMethod != null)
{
var userinfo = HttpContext.Current.User as ClaimsPrincipal;
string name = invocation.Method.Name;
var mappedParameters = MapParameters(invocation.Arguments, invocation.Method.GetParameters())
.ToDictionary(x => x.Key, x => x.Value.ToString());
string parameters = JsonConvert.SerializeObject(mappedParameters);
Stopwatch watch = Stopwatch.StartNew();
invocation.Proceed();
string exectime = watch.ElapsedMilliseconds.ToString();
string returnValue = JsonConvert.SerializeObject(invocation.ReturnValue);
_operatorLogs.Insert_TbSysOperatorLogAsync(new TbSysOperatorLog { CreateID = userinfo.FindFirst("sub").Value, CreateName = userinfo.FindFirst("user_name").Value, OperatorResult = returnValue, ClassMoudle = invocation.InvocationTarget.ToString(), OperatorMethod = name, OperatorParameters = parameters, ExecTime = exectime, Description = LogMethod.Option, IP = HttpContext.Current.Request.UserHostAddress });
}
}
public IEnumerable<KeyValuePair<string, object>> MapParameters(object[] arguments, ParameterInfo[] getParameters)
{
for (int i = ; i < arguments.Length; i++)
{
var obj = JsonConvert.SerializeObject(arguments[i]);
yield return new KeyValuePair<string, object>(getParameters[i].Name, obj); }
}
}
上述代码是结合 Owin中间件授权 加上 Autofac注入
在注入LoggerAttribute之前首先要注入相关的接口服务 IDAL_TbSysOperatorLog 是我的操作日志服务 ,在构造函数中加入对 IDAL_TbSysOperatorLog的依赖,然后结合Owin中间件中的信息,获取对应操作人员,之前也被AOP中如何获取日志操作人犯愁,后面发现这样做对了
Autofac注入相关代码:
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.GetCustomAttribute<DependencyRegisterAttribute>() != null)
.AsImplementedInterfaces().EnableInterfaceInterceptors()
.InstancePerLifetimeScope();
builder.RegisterType<LoggerAttribute>().InstancePerLifetimeScope();
builder.RegisterType<ExecTimeAttribute>().InstancePerLifetimeScope();
.EnableInterfaceInterceptors() 这是允许设置监控接口
.EnableClassInterceptors() 是允许设置监控类
根据实际项目情况设置
builder.RegisterType<LoggerAttribute>().InstancePerLifetimeScope(); //注册我们自定义的监控方法,实现IInterceptor就行了
这里设置监控的方法,类名称、参数值、执行时间、ip、方法返回值 等等
因为这里IInterceptor属性只能定义 类或者接口 那么对于接口或者类中的所有方法都会监控,怎么去除掉不必要的方法监控
自定义一个方法属性:设置属性只能用在方法上,这样含有该属性的方法就能写日志,日志一般会有描述(如:业务功能描述) 所以这里我加入了一个Option
[AttributeUsage(AttributeTargets.Method)]
public class LogMethodAttribute : Attribute
{
private string _option;
public LogMethodAttribute()
{
_option = "";
}
public LogMethodAttribute(string Option)
{ _option = Option;
} public string Option
{
get
{ return _option;
}
set {
_option = value;
} }
}
下面看看接口中的写法:
[Intercept(typeof(LoggerAttribute))]
public interface IBLL_TESTServices
{ [LogMethod(Option = "添加测试用例")]
Task<OperationResult> AddTEST(TESTModel model); List<dynamic> GetPremission(string guid);
}
接口中有两个方法,这里只监控了 AddTEST 方法 并产生操作日志,这里我里面的操作日志最好用异步

接下来测试下:查看数据库中数据

至此依然搞定,AOP 使我的代码耦合性降低了,我们不用在每个方法中去写很多方法,面向切面编程只需要写属性就ok,而且监控方法名 参数值 执行结果 想想都觉得棒~~
AOP实战(1)的更多相关文章
- springboot AOP实战
目录 AOP实战 maven依赖 定义切面 采用扫描类的方式 采用注解的方式 通知 前置通知 后置通知 返回通知 异常通知 环绕通知 JoinPoint 获取切点处的注解 git AOP实战 mave ...
- Spring AOP 实战运用
Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...
- Spring Boot 2.x(十一):AOP实战--打印接口日志
接口日志有啥用 在我们日常的开发过程中,我们可以通过接口日志去查看这个接口的一些详细信息.比如客户端的IP,客户端的类型,响应的时间,请求的类型,请求的接口方法等等,我们可以对这些数据进行统计分析,提 ...
- Spring AOP实战例子与springmvc整合不起效果的解决办法
在使用AOP之前,首先我们先了解一下什么是AOP吧.在网上很多人将AOP翻译为“面向切面编程”,什么是面向切面?与面向对象有什么区别呢? 在回答这两个问题之前,我们先要明白切面的概念. 切面由切点与增 ...
- iOS AOP实战
AOP: 面向切面编程,偏向于处理业务的某个阶段 适用场景: 1. 参数校验:网络请求前的参数校验,返回数据的格式校验等等 2. 无痕埋点:统一处理埋点,降低代码耦合度 3. 页面统计:帮助统计页面访 ...
- [转]彻底征服 Spring AOP 之 实战篇
Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...
- 161110、彻底征服 Spring AOP 之 实战篇
Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...
- 彻底征服 Spring AOP 之 实战篇
Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个 ...
- AOP的实现原理
1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...
随机推荐
- Leetcode 503. 下一个更大元素 II
1.题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应 ...
- bzoj 刷题计划~_~
bzoj 2818 两个互质的数的gcd=1,所以他们同时乘一个素数那么他们的gcd=这个素数,所以枚举素数p找n/p以内有多少对互质数,用欧拉函数. bzoj 2809 可并堆,对于每一个子树显然是 ...
- Docker Secrets
一.简介 在微服务架构应用中,众多组件在集群中动态地创建.伸缩.更新.在如此动态和大规模的分布式系统上,管理和分发密码.证书等敏感信息将会是非常具有挑战性的工作.对于容器应用,传统的秘密分发方式,如将 ...
- Python【pymysql】模块
import pymysql# 1.连上数据库 账号.密码 ip 端口号 数据库#2.建立游标#3.执行sql#4 .获取结果# 5.关闭游标#6.连接关闭coon = pymysql.connect ...
- python【内置函数&自定义函数】
=========================random函数:=======================
- python 模块之hashlib
Hashlib模块 Python里面的hashlib模块提供了很多加密的算法,这里介绍一下hashlib的简单使用事例,用hashlib的md5算法加密数据,其他的所有加密算法使用方式上基本类似. h ...
- ElasticStack系列之八 & _source 字段
有很多人会有这样的一个疑问: _source字段存储的是索引的原始内容,那 store 属性的设置是为何呢?elasticsearch 为什么要把 store 的默认取值设置为 no?设置为 yes ...
- NATS_04:NATS协议详解
NATS的协议是一个简单的.基于文本的发布/订阅风格的协议.客户端连接到 gnatsd(NATS服务器),并与 gnatsd 进行通信,通信基于普通的 TCP/IP 套接字,并定义了很小的操作集,换行 ...
- 介绍——基于类的视图(class-based view)
刚开始的时候,django只有基于函数的视图(Function-based views).为了解决开发视图中繁杂的重复代码,基于函数的通用视图( Class-based generic views) ...
- 2016/1/3 Python中的多线程(2):threading模块
之前提了Python多线程的一点使用,今天介绍更好的threading模块,它提供了Thread类和一些比较好用的同步机制. 先介绍Thread类 threading模块中的Thread类有很多thr ...