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.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)

    传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...

  2. 使用docker 安装 GITLIB

    在安装 gitlib 社区版时,配置老不成功,改成使用docker安装 比较顺利,省事. 1外部卷配置 docker 需要配置一些卷在外部,创建一下git的目录 我们创建一个在home下 创建一个gi ...

  3. 作用域的一些说明,static关键词

    作用域的一些说明 变量分为全局变量和局部变量.学过C语言的童鞋都知道,全局变量的作用域是整个整个文件.在即使在函数内部也有效,但在php中,如果在函数中使用全局变量,php会认为这个变量没有定义.如果 ...

  4. user\db\table_privs\column_privs四张表的权限控制

    今天要做的测试是:user\db\table_privs\column_privs这四张权限表分别控制哪些级别的权限: 测试准备: [超级用户]root@'127.0.0.1' [操作库权限的用户]g ...

  5. what is a resolver

    resolver [rɪ'zɒlvə] 解析器 ViewResolver The ViewResolver provides a mapping between view names and actu ...

  6. docker 搭建 MYSQL并且完成主从复制

    mysql主从复制逻辑: 1.从库执行start slave 开启主从复制. 2.从库请求连接到主库,并且指定binlog文件以及位置后发出请求. 3.主库收到从库请求后,将信息返回给从库,除了信息日 ...

  7. C++之const限定符(顶层const,底层const)

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7050815.html C++之const限定符(顶层const,底层cons ...

  8. 【repost】对JAVASCRIPT匿名函数的理解(透彻版)

    Query片段: view plaincopy to clipboardprint? (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其 ...

  9. web-day5

    第5章WEB05- BootStrap篇 今日任务 使用JQuery完成表单校验 使用BootStrap制作一个响应式页面 使用BootStrap制作网站首页 教学导航 教学目标 掌握什么是响应式及响 ...

  10. STL其他--<tuple>用法【C11】

     tuple 库 tuple 库 是能够将不同类型的对象组合起来形成一个对象.和pair 对象一样,但是可以组织多种不同类型的元素. tuple中的元素类型是在编译时期决定的.与<utility ...