程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> AOP 面向切面編程, Attribute在項目中的應用,aopattribute

AOP 面向切面編程, Attribute在項目中的應用,aopattribute

編輯:C#入門知識

AOP 面向切面編程, Attribute在項目中的應用,aopattribute


轉載自 歡大少的博客

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved