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

上一篇:20175120彭宇辰 《Java程序设计》第六周学习总结


下一篇:PHP很有用的一个函数ignore_user_abort ()