关于AOP的PIAB
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的更多相关文章
- C#进阶系列——AOP?AOP!
		前言:今天大阅兵,可是苦逼的博主还得坐在电脑前写博客,为了弄清楚AOP,博主也是拼了.这篇打算写写AOP,说起AOP,其实博主接触这个概念也才几个月,了解后才知道,原来之前自己写的好多代码原理就是基于 ... 
- 我心中的核心组件(可插拔的AOP)~第四回  异常拦截器
		回到目录 之前说过有关拦截器的文章,第二回 缓存拦截器,事实上,在那讲里说的最多是AOP和缓存组件,对于拦截的概念并没有详细的说明,这一讲,不说AOP,主要说一下拦截器,拦截器Interceptio ... 
- 【转】AOP知识点
		ref:http://www.diybloghome.com/prology/975.html 一.概念理解 老规矩,还是先看官方解释:AOP(Aspect-Oriented Programming, ... 
- WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成
		原文:WCF技术剖析之七:如何实现WCF与EnterLib PIAB.Unity之间的集成 在这之前,我写过深入介绍MS EnterLib PIAB的文章(参阅<MS Enterprise Li ... 
- C#进阶之AOP
		一.AOP概念(转自) AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技 ... 
- C#进阶系列——AOP
		一.AOP概念(转自) 老规矩,还是先看官方解释:AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程 ... 
- 使用Unity解耦你的系统—PART4——Unity&PIAB
		在前面几篇有关Unity学习的文章中,我对Unity的一些常用功能进行介绍,包括:Unity的基本知识.管理对象之间的关系.生命周期.依赖注入等,今天则是要介绍Unity的另外一个重要功能——拦截(I ... 
- 20181122_C#中AOP_使用Unity实现AOP
		一. 使用Unity的AOP实现 a) 整体项目截图: b) 添加Unity的Nuget包, 直接使用最新版就行, 需要添加两个 Unity 和 Unity.Interceptio ... 
- 特性attribute,声明和使用attribute,应用attribute,AOP面向切面,多种方式实现AOP
		1 特性attribute,和注释有什么区别2 声明和使用attribute3 应用attribute4 AOP面向切面5 多种方式实现AOP ---------------------------- ... 
随机推荐
- JSON转JS对象,JS对象转JSON
			一.从服务端发来的json字符串,怎么才能作为JavaScript对象(JSON对象)在web端调用呢? 1.如果使用jQuery,就很方便了,可以在ajax一系列函数中,把参数Datatype传js ... 
- java正则表达式笔记
			import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntax ... 
- WPF编程宝典(Pro wpf in c# 2012)(文摘)
			第一部分 基础知识 第1章 WPF概述 第2章 XAML 第3章 布局 第4章 依赖项属性 第5章 路由事件 第二部分 进一步研究WPF 第6章 控件 第7章 Application类 第8章 元素绑 ... 
- JWT 理解
			概念: JWT是json web token缩写.它将用户信息加密到token里,服务器不保存任何用户信息.服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证. 优点是在分布式系统中, ... 
- java Concurrent包学习笔记(三):ReentrantLock
			一.可重入性的理解 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程每进入一次,锁 ... 
- Java之spilt()函数,trim()函数
			一.单个符号作为分隔符 package com.regix; public class FuncSpilt { public static void main(String[] args) { // ... 
- 比较jquery中的after(),append(),appendTo()方法
			html页面: <p id="myp1">我的兴趣爱好是:</p> <button id="b1">after函数</ ... 
- HBase thrift2 TIOError
			如果HBase thrift2报:"TIOError exception: Default TException", 这个可能是因为操作的表不存在,不一定是网络或磁盘操作异常. H ... 
- CentOS 5 上配置 Redmine 和 Git
			现在我们用 Trac + Git 来管理所有的项目,早些时候是由 Trac + Subversion 管理的,和 Git 比较起来 Subversion 简直就是龟速.虽然我们前段时间换成了 Git ... 
- centos修改主机名命令
			centos修改主机名命令 需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到root用户. vi / ... 
