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