一、AOP(面向切面编程)简介

  在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承、多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操作行为,AOP就是将这些重复的操作提取出来,运用动态代理,实现程序功能的统一维护,举个例来说,就像登陆判断,权限判断,以及记录日志都是通过AOP来实现,想网上现在也有很多有关AOP理论知识的介绍,我就不做一一的介绍了,我也不是很了解,我今天从我在开发中运用到的Attribute来讲解AOP

二、Attribute(特性)介绍

  我们可以这么说,Attribute就是一个标记,就相当与给被标记的类或方法写备注,这个与普通的备注有什么区别呢?主要的区别是普通备注不能通过程序来调用的,而Attribute中的值是可以通过程序来调用的

我们想举个例吧,先看代码

  我们先定义一个Attribute的类,他继承于基类Attribute

  [AttributeUsage(AttributeTargets.Class,AllowMultiple=false)]
public class VersionAttribute : Attribute
{
public string Name { get; set; }
public string Date { get; set; }
public string Describtion { get; set; }
}
  AttributeUsage也是一个特性有两个参数,AttributeTargets是用于来标记当前的特性的作用域All,Class,Method,Assembly 比较常用,其他的也可以了解一下,AllowMultiple该值指示的属性能否由派生类和重写成员继承
  下面我们写一个使用Attribute的类
    [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
public class MyCode
{
//...
}

  这个内的Attribute的特性就是上面写的,就是给VersionAttribute 中的属性赋值,同时,我们在其他地方使用MyCode的同时也可以使用到他的属性

  Attribute的应用

    class Program
{
static void Main(string[] args)
{
var info = typeof(MyCode);
var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));
Console.WriteLine(classAttribute.Name);
Console.WriteLine(classAttribute.Date);
Console.WriteLine(classAttribute.Describtion);
}
}

  

三、ActionFilterAttribute介绍

  ActionFilterAttribute继承可FilterAttribute, IActionFilter, IResultFilter三个基类,他的主要的功能是拥有拦截器的功能,IActionFilter中定义了连个方法,分别为OnActionExecuting()跟OnActionExecuted(),OnActionExecuting()是在执行操作方法前由 ASP.NET MVC 框架调用;OnActionExecuted()是在执行操作方法后由 ASP.NET MVC 框架调用 ,IResultFilter中定义了两个方法,分别为OnResultFiltering()跟OnResultFiltered(),OnResultFiltering()在执行操作结果前由 ASP.NET MVC 框架调用。OnResultFiltered()在执行操作结果后由 ASP.NET MVC 框架调用。

四、Attribute的AOP应用

    public class UserCheckAttribute : ActionFilterAttribute, IActionFilter
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.Controller as WebsiteController;
if (controller == null)
return;
var loginInfo = controller.LoginInfo;
if (loginInfo == null || loginInfo.Merchant.MerchantId == )
return;
var result = SubscribeBusiness.CheckMerchantMaxUser(loginInfo.Merchant.MerchantId);
if (result != null && result.Success == false)
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult()
{
Data = new
{
Success = false,
Message = string.Format("用户已达到上限,请升级服务后重试,<a href=\"{0}\" style=\"color:red;\" target=\"_blank\">点我升级!</a>",
RouteHelper.Action("index", "purchase", new {area="" }))
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
{
filterContext.Result = new RedirectAction("index", "purchase", new { area = "" });
}
}
base.OnActionExecuting(filterContext);
}
}

  这是一个检查用户已达到上限的Attribute类,并给出相应的提示,在个类中重写了OnActionExecuting方法,如果用户到了上限,改变ActionExecutingContext 的的Result。

  调用方法

        [UserCheck]
[HttpPost]
public JsonResult AddParner(DealerSaveContext model)
{
......
return Json(new { Success = result.Success, Message = result.Message });
}

  这样就用AOP完成了权限的检查

AOP 面向切面编程, Attribute在项目中的应用的更多相关文章

  1. 极简SpringBoot指南-Chapter05-SpringBoot中的AOP面向切面编程简介

    仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...

  2. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

  3. Z从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    本文梯子 本文3.0版本文章 代码已上传Github+Gitee,文末有地址 大神反馈: 零.今天完成的深红色部分 一.AOP 之 实现日志记录(服务层) 1.定义服务接口与实现类 2.在API层中添 ...

  4. Method Swizzling和AOP(面向切面编程)实践

    Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...

  5. C# AOP 面向切面编程之 调用拦截

    有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...

  6. 【原创】Android AOP面向切面编程AspectJ

    一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...

  7. 论AOP面向切面编程思想

    原创: eleven 原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg [前言] AOP(Aspect-Oriented Programming ...

  8. Aspects– iOS的AOP面向切面编程的库

    简介 一个简洁高效的用于使iOS支持AOP面向切面编程的库.它可以帮助你在不改变一个类或类实例的代码的前提下,有效更改类的行为.比iOS传统的 AOP方法,更加简单高效.支持在方法执行的前/后或替代原 ...

  9. Spring Boot2(六):使用Spring Boot整合AOP面向切面编程

    一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop ​ aop全称Aspec ...

随机推荐

  1. IDEA中maven搭建Spring+SpringMVC+mybatis项目

    一.介绍 使用IDEA搭建maven web项目,整合框架Spring+SpringMVC+mybatis 项目结构图:

  2. php实现文件上传与下载(中)

    出现不想让用户看见的信息,可以使用错误抑制符号@:当然能echo的东西都是可以赋值给一个变量的: 定义用户上传文件类型,将其放在数组变量allowExt中,用if(!in_array(第一个参数为获取 ...

  3. 10个最常见的 HTML5 面试题及答案

    这是选择了10个 HTML5 面试问题并给出了答案.这是 Web 开发人员最常见的面试问题,相信你掌握了这些重要的面试问题后一定会觉得你的理解提高了.一起来看看吧. 您可能感兴趣的相关文章 Web 前 ...

  4. socket 函数

    1.创建套接字并返回一个描述符,该描述符可以用来访问套接字 #include<sys/types.h> #include<sys/socket.h>  int socket(i ...

  5. WPF这样的界面应该如何编写呢?

    如上图: 外围是一个Border,内部填充一个Grid,Grid分成两行,第一行有一个按钮可以进行操作(主要是操作ListBox的数据源:增加和删除对象),第二行填充一个ListBox,绑定数据源并根 ...

  6. C#RSA算法实现+如何将公钥为XML格式转为PEM格式,给object-C使用

    .net中,处于安全的考虑,RSACryptoServiceProvider类,解密时只有同时拥有公钥和私钥才可以.原因是公钥是公开的,会被多人持有.这样的数据传输是不安全的.C#RSA私钥加密,公钥 ...

  7. Linux学习之三--scp命令

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  8. js replaceAll

    js 全部替换: /** * 替换(所有) * @param str 要处理的字符串 * @param beRepStr 被替换的字符串 * @param toRepStr 最终生成的字符串 * @r ...

  9. 一对一还是一对多? MVP设计前提

    设计MVP之前,先要确定好以下模块之间是一对多还是一对一的关系: View ---> Presenter --> Model --> Interface(URL) 就是一个View只 ...

  10. PPM图片格式及其C读写代码

    PPM图像格式介绍 PPM图像格式是由Jef Poskanzer 大叔,在我出生那一年,也就是1991年所创造的,碰巧的是PPM也是天蝎座. PPM(Portable Pixmap Format)还有 ...