一.AOP的概念
AOP就是将公用功能提取出来,如果以后公用功能的需求发生变化,只需要改动公用的模块的代码即可,多个调用的地方则不需要改动。所谓面向切面,就是只关注通用功能,而不关注业务逻辑。实现方式一般是通过拦截。比如,我们随便一个Web项目基本都有的权限验证功能,进入每个页面前都会校验当前登录用户是否有权限查看该界面,我们不可能说在每个页面的初始化方法里面都去写这段验证的代码,这个时候我们的AOP就派上用场了,AOP的机制是预先定义一组特性,使它具有拦截方法的功能,可以让你在执行方法之前和之后做你想做的业务,而我们使用的时候只需要的对应的方法或者类定义上面加上某一个特性就好了。
二.AOP的优势
1、将通用功能从业务逻辑中抽离出来,可以省略大量重复代码,有利于代码的操作和维护。
2、在软件设计时,抽出通用功能(切面),有利于软件设计的模块化,降低软件架构的复杂度。也就是说通用的功能都是一个单独的模块,在项目的主业务里面是看不到这些通用功能的设计代码的。
三.AOP的实现
1.首先新建一个公共函数SysLogAttribute。
2.引用 AspectCore.DynamicProxy 包
3.此时使用的是多线程技术。
4.利用文案的$$符号进行分隔。
public int LogDictionaryID {
get; set; }
public override Task Invoke(AspectContext context, AspectDelegate next)
{
var task = context.Invoke(next);
task.Wait();
var a = context.IsAsync()
? context.UnwrapAsyncReturnValue()
: context.ReturnValue;
var ret = (Result)a;
if (ret.Success)
{
int userId = UserDataContextHelper.GetUserID();
var ip = WebUtils.GetRequestIP();
Task.Factory.StartNew(() =>
{
try
{