zoukankan      html  css  js  c++  java
  • AOP(面向切面)的粗俗理解

    百度百科的解释:AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。

    一个比较绕的概念,简单来说就是把不影响业务流程的功能独立封装出来,不用在需要使用该功能的方法中显示调用该方法。

    代码为例:

    public void Edit(Book book)
    {
            //验证用户是否有权限的代码
            //方法的主体逻辑
            //记录操作日志的代码
    }        

    在上面的方法中,只有主体逻辑才是这个方法的核心,权限和日志都不影响该逻辑的具体实现,如果把具体方法都写在这里则会显得臃肿,同时耦合度很高,如果出现多个地方拥有相同代码一旦变更则变得很麻烦,我们可以将权限和日志拆分成两个独立方法,封装到不同类里面去,从而使得方法内部耦合性降低,方法和类的功能单一。

    public class Role
    {
    public static bool IsOk(User user)
    {
    //验证权限的具体代码 } } ; public class Log
    {
    public static void LogText(User user,Book book)
    {
    //记录日志的具体代码 } } ; /*上文提到的方法*/ public void Edit(Book book)
    {
    if(Role.IsOk(Session["User"])) { // do something... }else{ // do something... } //方法的主体逻辑 Log.LogText(Session["User"],book); }

    以上是常规方法中用到的解耦方法,而有了AOP之后怎么做呢,拿过ASP.NET MVC的滤器举例

    public class RoleFilterAttribute : ActionFilterAttribute
    {
             public override void OnActionExcuting(ActionExecutingContext filterContext)
             { 
                //验证权限代码
             }
    };
    public class LogFilterAttribute : ActionFilterAttribute
    {
             public override void OnActionExcuted(ActionExecutingContext filterContext)
             { 
                //记录日志代码
             }
    };
    /*原来的方法*/
    [LogFilter]
    [RoleFilter]
    public void Edit(Book book){
        //主体逻辑
    }

    有了切面之后,跟主体逻辑无关的变更只需要在过滤器中更改就可以了,原来的方法去除这些无关的功能后代码显得更清晰。

    至于过滤器怎么实现在Eidt执行前调用权限验证或者在执行结束后记录日志,则已经超出面向切面概念的理解。

  • 相关阅读:
    关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题
    OPCDAAuto.dll的C#使用方法浅析(转载)
    微软系统工具包Sysinternals Suite官方下载地址
    C#的dll被其他程序调用时,获取此dll正确的物理路径
    根据存储过程,查询此过程的参数和参数数据类型讯息
    sql server中类似oracle中decode功能的函数
    c# HttpWebResponse 调用WebApi
    MariaDB10.4以上版本安装
    Windows server 2012 显示“我的电脑”
    Debian 9 启动后进入命令行
  • 原文地址:https://www.cnblogs.com/jasonlwings/p/5512438.html
Copyright © 2011-2022 走看看