轉載自 歡大少的博客
一、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完成了權限的檢查