惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
美团技术团队
Last Week in AI
Last Week in AI
Microsoft Azure Blog
Microsoft Azure Blog
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
B
Blog RSS Feed
J
Java Code Geeks
The GitHub Blog
The GitHub Blog
人人都是产品经理
人人都是产品经理
Recorded Future
Recorded Future
The Register - Security
The Register - Security
博客园 - 三生石上(FineUI控件)
Recent Announcements
Recent Announcements
Recent Commits to openclaw:main
Recent Commits to openclaw:main
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
博客园 - 【当耐特】
C
Check Point Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Simon Willison's Weblog
Simon Willison's Weblog
T
Troy Hunt's Blog
P
Privacy International News Feed
S
Security Affairs
The Cloudflare Blog
P
Proofpoint News Feed
G
GRAHAM CLULEY
Engineering at Meta
Engineering at Meta
A
Arctic Wolf
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
D
Docker
S
SegmentFault 最新的问题
N
News | PayPal Newsroom
Cyberwarzone
Cyberwarzone
H
Help Net Security
T
Threatpost
A
About on SuperTechFans
L
LINUX DO - 热门话题
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
N
News and Events Feed by Topic
Attack and Defense Labs
Attack and Defense Labs
M
MIT News - Artificial intelligence
Schneier on Security
Schneier on Security
月光博客
月光博客
F
Fortinet All Blogs
L
Lohrmann on Cybersecurity

博客园 - Franz

从如此简单的代码谈起 谈谈C#基元类型 TFS代码签入指导 并发之阿喀琉斯之踵 SmallDateTime时间范围检查 too many automatic redirections were attempted 预览Cube出现没有注册类错误 Transaction Manager Maximum Timeout .NET下的延迟加载 我的VisualStudio工具箱 TFS上使用Beyond Compare来比较源码 SqlBulkCopy 是个好对象 释放Sql Server内存 吐槽一下Silverlight的SaveFileDialog. 书评《模式-工程化实现及扩展》 定义加载动画 代码共享的小技巧 WPF将控件保存为图片 《编程人生》的书评
简单的谈一下.NET下的AOP
Franz · 2013-06-27 · via 博客园 - Franz

2013-06-27 08:20  Franz  阅读(236)  评论()    收藏  举报

AOP有着它优良的好处, 从一个层面上去关心一个问题, .NET对此有良好的支持.如果硬生生的看MSDN不理解里面的思想是有掉入深渊的感觉的.

为了理解AOP的机制, 我们从需求开始说起,实现AOP就是能在方法执行之前插入一段代码.当然这里所说的方法包括构造函数.

微软的实现策略是将对某些方法的调用转换成消息, 再将消息转换为方法调用, 此时就在方法的调用上产生了空隙, 这个空隙就是可以进行利用的, 举例来说吧, A方法调用了B方法, 首先将A的调用B这个行为的栈帧消息化, 消息化后可以发送到任何地方(跨Domain或者跨机器都是可以的), 拿到消息后还原栈帧,可以直接调用B方法了.负责这项工作的类是System.Runtime.Remoting.Proxies.RealProxy以及封送调用的透明代理.

因为走消息化这一套是需要成本的, 我们通常情况下是不需要这么去做的, 所以在.NET设计时就要考虑从特定结构上继承的才会享有此待遇. .NET选择了 System.MarshalByRefObject对象作为基类, .NET Clr给此类的所有子类一个特权, 就是可以消息化(注意这里是可以, 而不是一定); 另外提一句, 编译器也是对此特殊优待的, 从System.MarshalByRefObject对象上继承的任何类的方法都不会被内敛(内敛了就不存在方法了, 也就不可能被消息化).

这个过程要自己生成RealProxy对象, 所以比较繁琐, 强大的.NET怎么能忍心看苦逼的程序员饱受此困扰呢,这是又有了个更优待的对象System.ContextBoundObject, 又一个特等公民产生了, ContextBoundObject能自动产生透明代理(具体可以参看object activation), 那么我们的AOP行为从那里指定呢, 这就得益于.NET的元数据编程了, 使用.NET特性. 特性必须实现System.Runtime.Remoting.Contexts.IContextAttribute即可.

这样就有了现在的.NET AOP的实现.