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. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...
随机推荐
- HDU 6231
K-th Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tot ...
- Java 从业一年的心得体会
在你打开此文时,你或许在犹豫这个职业,但是我觉得干就好了,没有适合不适合,趁年轻折腾吧! 以下是我一年来从事Java的经验积累,知识有很多,经验就九条 1.设计的数据库表尽量添加一个状态位,可以在删除 ...
- Kubernetes Deployment与Replica Set
Deployment相对于RC的优势 RS与Deployment主要用于替代RC.RS的全称为Replica Set.相对于RC,RS与Deployment的优势如下: RC只支持基于等式的selec ...
- linux(ubuntu) mysql安装使用
简单的安装一下: sudo apt-get install mysql-server apt-get isntall mysql-client sudo apt-get install libmysq ...
- iis配置访问错误
最近换工作,忙着熟悉新的环境,新的框架技术(银行用的EBF),各种碰坑. 总结一下iis配置过程当中遇到的一个坑------ 按照环境搭配手册一步一步的配置,在我机器上访问一直报500的错,但是同样的 ...
- [Java] 集合框架原理之二:锁、原子更新、线程池及并发集合
java.util.concurrent 包是在 Java5 时加入的,与 concurrent 的相关的有 JMM及 AbstractQueuedSynchronizer (AQS),两者是实现 c ...
- IIS错误整理收集【持续更新】
一.HTTP 错误 403.14 - Forbidden HTTP 错误 403.14 - Forbidden,Web 服务器被配置为不列出此目录的内容. 解决方案:修改程序池.NET Framewo ...
- 【转】(总结)Nginx配置文件nginx.conf中文详解
本文转载自:http://www.ha97.com/5194.html 定义Nginx运行的用户和用户组 user www www; nginx进程数,建议设置为等于CPU总核心数 worker_pr ...
- Clockwise/Spiral Rule
[Clockwise/Spiral Rule] There is a technique known as the ``Clockwise/Spiral Rule''. (顺时针螺旋法则). Ther ...
- Nginx upstream的5种权重分配方式【转】
原文地址:Nginx upstream的5种权重分配方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight指定轮询几率,weig ...