ASP.NET MVC中有关AOP的编程

  AOP(Aspect oriented programming)面向切面编程,主要意思是把相同、相似的并且零散的逻辑抽离出来,统一处理,这样不仅维护起来方便,也使得代码更加关注自己本身,清晰明了。

  比如我们常见的权限检查,验证登陆,异常处理等都是散乱在系统各个地方,比如管理员在登陆状态才可以添加一个学生信息:

      

        public ActionResult AddStudent(Student student)
        {
            if (currentUser != null)
            {
                StudentDAL.Add(student);
            }
            else
            {
                //do something else
            }
        } 
View Code

  本来一句StudentDAL.Add(student)就可以实现的功能,现在却要加上if else,还要处理异常,代码显得很难看,如果采用如下的方式:

    

        [HttpPost]
        [Authorize]
        public ActionResult AddStudent(Student student)
        {
            StudentDAL.Add(student);
            return View();
        }
View Code

  这种用AuthroizeAttribute特性来处理问题的方式,就是AOP的思想,不仅使代码更加清晰,而且还可以复用这个Attribute。

  Attribute只是一种实现方式,Attribute也是在调用具体的action前,通过反射得到Attribute,然后执行代码。像验证登陆可以放在基类Controller中去做判断,而一些细化的权限控制我们可以自定义Attribute来实现。

  下面是一个异常处理的例子,如果有一个统一的处理异常的逻辑,那么逻辑代码里就可以不用try catch,而是直接throw exception,会让代码更简洁。(并不是说有了统一处理就再不用try catch了,有些异常还是要去捕获,看具体业务需求,另外捕获不到异常的比如线程里的要注意catch)。

  

        public ActionResult AddStudent(Student student)
        {
            if (string.IsNullOrEmpty(student.Name))
            {
                throw new ArgumentException("name");
            }
            return View();
        }

        protected override void OnException(ExceptionContext filterContext)
        {
            string filePath = Server.MapPath("~/exception.txt");
            using (StreamWriter writer = System.IO.File.AppendText(filePath))
            {
                writer.WriteLine(filterContext.Exception.Message);
            }
            base.OnException(filterContext);
            Response.Redirect("~/Error/NotFound");
        }
View Code

  只要在Controller中重写OnException方法就可以处理该控制器中所有的异常,实现记录异常日志(利用Log4Net),跳转到自定义错误页面等。

  当然也可以自定义针对Action的异常处理特性。

  

public class ExceptionLogFilterAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            string filePath =HttpContext.Current.Server.MapPath("~/exception.txt");
            using (StreamWriter writer = System.IO.File.AppendText(filePath))
            {
                writer.WriteLine(filterContext.Exception.Message);
            }
            HttpContext.Current.Response.Redirect("~/Error/NotFound");
        }
    }
View Code

  

转载于:https://www.cnblogs.com/CodePastry/p/3861889.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值