AOP 面向切面编程, Attribute在项目中的应用
一、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在项目中的应用的更多相关文章
- 极简SpringBoot指南-Chapter05-SpringBoot中的AOP面向切面编程简介
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...
- Z从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
本文梯子 本文3.0版本文章 代码已上传Github+Gitee,文末有地址 大神反馈: 零.今天完成的深红色部分 一.AOP 之 实现日志记录(服务层) 1.定义服务接口与实现类 2.在API层中添 ...
- Method Swizzling和AOP(面向切面编程)实践
Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...
- C# AOP 面向切面编程之 调用拦截
有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...
- 【原创】Android AOP面向切面编程AspectJ
一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...
- 论AOP面向切面编程思想
原创: eleven 原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg [前言] AOP(Aspect-Oriented Programming ...
- Aspects– iOS的AOP面向切面编程的库
简介 一个简洁高效的用于使iOS支持AOP面向切面编程的库.它可以帮助你在不改变一个类或类实例的代码的前提下,有效更改类的行为.比iOS传统的 AOP方法,更加简单高效.支持在方法执行的前/后或替代原 ...
- Spring Boot2(六):使用Spring Boot整合AOP面向切面编程
一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop aop全称Aspec ...
随机推荐
- [bigdata] flume file channel CPU消耗比 memory channel高的原因
https://www.quora.com/Why-does-flume-take-more-resource-CPU-when-file-channel-is-used-compared-to-wh ...
- 如何修改SharePoint2013服务器场帐号密码
服务器远程登录帐号密码修改密码后,如何修改sharepoint服务器场管理员账户密码,今天登录了一下N久以前的搭建sharepoint2013服务器场的一台服务器器,登录进去以后直接提示帐号密码过期需 ...
- UITextField的placeholder文字的位置,颜色等的自定义设置
//控制placeHolder的位置,左右缩20 -(CGRect)placeholderRectForBounds:(CGRect)bounds { CGRect inset = CGRectMak ...
- Java学习笔记14---使用标志位控制循环
使用标志位控制循环 前面提到了控制循环的常用技术:计数器控制的循环.另一种控制循环的常用技术是在读取和处理一个集合的值时指派一个特殊值.这个特殊的输入值也成为标志值(sentinel value),用 ...
- Java中FilterInputStream和FilterOutputStream的用法
FilterInputStream FilterInputStream 的作用是用来"封装其它的输入流,并为它们提供额外的功能".它的常用的子类有BufferedInputStre ...
- nuget包重装
Update-Package -Reinstall Update-Package -reinstall -ProjectName Cardin.HeartCare.Service.ChatServic ...
- JavaScript原型
prototype与_proto_ 对象的 prototype 属性的方法.属性为对象所属的那一"类"所共有.对象原型链通过 proto 属性向上寻找. 为 proto 指定 nu ...
- 2.2、Hibernate用注解方式实现一对多、多对多关系
一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...
- 云服务器 Centos7.0 部署
CentOS安装jdk的三种方法 http://www.mamicode.com/info-detail-613410.html centos Linux下安装Tomcat和发布Java的web程序 ...
- apache 虚拟机配置
<VirtualHost *:80> DocumentRoot /www/htdocs/caipiao ServerName www.aaa.com ServerAlias aaa.com ...