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 == 0) 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完成了权限的检查