AOP:面向切面编程,也就是在运行过程中,按照需要动态加载功能块

PIAB:含义可以从下面提取

Microsoft Patterns & Practices团队在2007年发布的Enterprise Library 3.0 February 2007 CTP中,我们惊喜地发现了AOP的踪迹,其名为Policy Injection Application Block(PIAB)。Enterprise Library的产品经理Tom Hollander和架构师Edward Jezierski都相继在自己的博客上介绍了PIAB。从特征与功能来看,已经基本具备了AOP的要求。

从技术实现来看,PIAB并没有特别的创新,沿用了大多数致力于.NET平台AOP研究人员的思路,采用了Remoting Proxy技术。PIAB定义了特殊的工厂类,通过它添加Policy,然后创建代理对象实例。受到Remoting Proxy技术的限制,所谓的代理对象必须继承自MashalByRefObject。例如:
public class LoggingTarget : MarshalByRefObject
{
    public string DoSomething(int one, string two, double three)
    {
        return string.Format("{1}: {0} {2}", one, two, three);
    }
}

添加Policy与创建Aspect对象的方法如下:
private PolicySet GetLoggingPolicies()
{
    PolicySet policies = new PolicySet();

Policy simpleInputsPolicy = new Policy("simpleInputsPolicy");
    simpleInputsPolicy.RuleSet.Add(new MatchByNameRule("MethodWithSimpleInputs"));
    simpleInputsPolicy.Handlers.Add(new SignatureCheckingHandler(new Type[] { typeof(int), typeof(string) }));
    policies.Add(simpleInputsPolicy);
    return policies;
}
private LoggingTarget CreateTarget()
{
    InterceptionFactory factory = new InterceptionFactory();
    factory.AddPolicies(GetLoggingPolicies());
    return factory.CreateNew<LoggingTarget>();
}

代理对象(Proxy Object)会通过Handler链定位到真实对象(Real Object),而Policy则被注入到代理对象和真实对象中。整个流程如图:

在Policy中,包含了一个Matching Rules集合以及Handlers Pipeline。从AOP技术的角度来看,代理对象所指代的真实对象就是“Aspect”,而Policy则是切入点,它可以通过Matching Rules来定位代理对象的方法,至于Handler则近似于Advise。

Authorization横切关注点(Cross-Cutting Concerns)的处理方式如图所示:

PIAB目前预定义的Handler包括Validation Handler、Logging Handler、Exception Handling Handler、Authorization Handler、Caching Handler。这些Handler与Enterprise Library中的其他Application Block几乎是一一对应的。事实上,权限认证、日志、异常处理、缓存等,恰恰都是AOP技术最重要的关注点。在February 2007 CTP版本之前的Application Block,实际上已经具备了AOP的雏形。然后,由于它在“横切”与“注入”方面的缺乏,始终无法达到AOP所要求的重用目的。Policy Injection Application Block正好弥补了这样的缺憾。

本人也曾利用Remoting Proxy技术开发了.NET平台下的AOP组件,基本实现了AOP的主要功能。然后因为两个困惑,使得这一工作没有继续进行下去。

1、使Aspect对象继承自MarshalByRefObject是否过于专制?鉴于许多语言都具备单继承的特性,如果剥夺了一个类继承的能力,就使得程序的设计者多了很多约束。这是否是明智的选择呢?

2、继承自MarshalByRefObject后,效率究竟如何?我曾经做个这样的测试,发现继承自MarshalByRefObject类的对象比没有继承MarshalByRefObject类的对象,在性能上相差了几十倍。PIAB采用Remoting Proxy技术,是否在性能上有所考虑呢?

关于AOP的PIAB的更多相关文章

  1. C#进阶系列——AOP?AOP!

    前言:今天大阅兵,可是苦逼的博主还得坐在电脑前写博客,为了弄清楚AOP,博主也是拼了.这篇打算写写AOP,说起AOP,其实博主接触这个概念也才几个月,了解后才知道,原来之前自己写的好多代码原理就是基于 ...

  2. 我心中的核心组件(可插拔的AOP)~第四回 异常拦截器

    回到目录 之前说过有关拦截器的文章,第二回  缓存拦截器,事实上,在那讲里说的最多是AOP和缓存组件,对于拦截的概念并没有详细的说明,这一讲,不说AOP,主要说一下拦截器,拦截器Interceptio ...

  3. 【转】AOP知识点

    ref:http://www.diybloghome.com/prology/975.html 一.概念理解 老规矩,还是先看官方解释:AOP(Aspect-Oriented Programming, ...

  4. WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成

    原文:WCF技术剖析之七:如何实现WCF与EnterLib PIAB.Unity之间的集成 在这之前,我写过深入介绍MS EnterLib PIAB的文章(参阅<MS Enterprise Li ...

  5. C#进阶之AOP

    一.AOP概念(转自) AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技 ...

  6. C#进阶系列——AOP

    一.AOP概念(转自) 老规矩,还是先看官方解释:AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程 ...

  7. 使用Unity解耦你的系统—PART4——Unity&PIAB

    在前面几篇有关Unity学习的文章中,我对Unity的一些常用功能进行介绍,包括:Unity的基本知识.管理对象之间的关系.生命周期.依赖注入等,今天则是要介绍Unity的另外一个重要功能——拦截(I ...

  8. 20181122_C#中AOP_使用Unity实现AOP

    一.   使用Unity的AOP实现 a)         整体项目截图: b) 添加Unity的Nuget包, 直接使用最新版就行, 需要添加两个 Unity 和 Unity.Interceptio ...

  9. 特性attribute,声明和使用attribute,应用attribute,AOP面向切面,多种方式实现AOP

    1 特性attribute,和注释有什么区别2 声明和使用attribute3 应用attribute4 AOP面向切面5 多种方式实现AOP ---------------------------- ...

随机推荐

  1. 2019.01.23 ural1519 Formula 1(轮廓线dp)

    传送门 轮廓线dpdpdp模板题. 题意简述:给一个放有障碍的网格图,问有多少种方法能使所有非障碍格子都在同一条哈密顿回路上面. 考虑用括号序列的写法来状压这个轮廓线. 用000表示没有插头,111表 ...

  2. 2018.11.07 NOIP训练 lzy的游戏(01背包)

    传送门 考虑对于每次最后全部选完之后剩下的牌的集合都对应着一种构造方法. 一个更接地气的说法: 设消耗的牌数为ttt,如果使用的牌的lll值之和也为ttt,则对应着一种构造方式让这种情形成立. 于是做 ...

  3. JSON.parse和JSON.stringify的区别

    JSON.stringify()的作用是将 JavaScript 值转换为 JSON 字符串, 而JSON.parse()可以将JSON字符串转为一个对象. 简单点说,它们的作用是相对的,我用JSON ...

  4. centos7安装桌面环境

    在命令行运行: yum groupinstall ‘GNOME Desktop’

  5. js短信验证码

    短信验证码,无注释,url顺便写的错的,所以会报错 <!DOCTYPE html> <html> <head> <meta charset="UTF ...

  6. 使用函数的列 group by 分组需要别名

    问题描述 使用如下截图的SQL统计数据,报1105错误,提示all columns in group by clause should be in the selected column. 给格式化 ...

  7. SpringMVC处理模型数据

    目录结构 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi= ...

  8. day31(正则表达式)

    1.校验密码强度密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间.^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 2. 校验中文字符串 ...

  9. day23(事务管理)

    事务管理 事务管理两种方式: 向下传递,ThreadLocal 向下传递的方式(依赖) 缺点:不利于测试 Service层 获取连接conn(Connection) 转账(conn) 收账(conn) ...

  10. Hadoop-1.2.1伪分布下 hive-0.10.0内嵌模式安装

    Hadoop-1.2.1伪分布下 hive-0.10.0内嵌模式安装 1.下载hive-0.10.0 网址是:http://archive.apache.org/dist/hive/hive-0.10 ...