博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用PostSharp开始AOP
阅读量:4977 次
发布时间:2019-06-12

本文共 2351 字,大约阅读时间需要 7 分钟。

近段时间有时间看看以前写的代码,系统有一个功能:用户的任意一个修改,删除操作都要进行日志记录,当时进度太赶,也只是知道 aop(关于什么是 aop 请自行google) 能处理这方面的问题,具体的还没接触 :( . --- 当时我的处理方式是将日志写为一个静态方法,然后在每个操作完成后加上: Log.write(用户ID, "操作信息") ;随着系统的增大,新的功能新的成员不断地加入, 问题就出现了.每个成员都会问:这个日志该怎么记录(虽然有文档,可总是感觉不太方便)?

近几天接触 PostSharp, 看看别人写的挺简单的,遂决定试一下(先前看过 Castle ,可它的动态代理好像只能在 virtual 方法上,不知道是我理解错了还是..否则就是 要用上 ioc....放弃).
就我所理解的,选用 PostSharp 的好处有:
1.采用 MSIL 静态代码注入,避免使用反射;
2.使用 MSBuild Task,使得开发人员可以像使用编译器内置 Attribute 那样使用 AOP;
3.可以拦截任意方法而不是局限于 virtual 方法;
4.对调用方法有更多的控制方法,比如输入参数,返回结果等
话会正题.开始前先到官网下载一个版本的 PostSharp(www.postsharp.org). 现在已经出了2.0 了,不过是45天的试用期,(过期收费?).装上试一下,它会在 vs2008 上面安插一个插件(这个暂不理会).真正到项目中使用的还是免费的好(我自己怎么为公司掏?),还是下个 1.5 的吧,关闭 vs 后安装.
新建一个 console 项目. 先模拟实现 Log:

ContractedBlock.gif
ExpandedBlockStart.gif
日志模拟记录
    
public
 
static
 
class
 Log
    {
        
public
 
static
 
void
 Write(MethodExecutionEventArgs eventArgs,
string
 message)
        {
            Console.WriteLine(
"
开始日志记录.方法名: {0} , 实例名: {1}. 附带信息:{2}
"
,
                eventArgs.Method.Name, eventArgs.Instance , message );
        }
    }

引用postsharp相关dll后(1.5: postsharp.laos ,postsharp.public  .2.0 就 postsharp ) 再实现某个类型的 attribute : 继承自 AttributeTargets (1.5 的namespace 是 PostSharp.public ,2.0 好像 PostSharp.Aspects )

ContractedBlock.gif
ExpandedBlockStart.gif
注意:1.5和 2.0 方法签名不一样
    [Serializable]
    [
global
::System.AttributeUsage(AttributeTargets.All, AllowMultiple
=
true
)]
    
public
 
class
 PostsAttribute  : OnMethodBoundaryAspect
    {
        
/*
 PostSharp 2.0 里可用的方法
        public override void OnSuccess(MethodExecutionArgs args)
        {
            Console.WriteLine("...{0}...onsuccess......", DateTime.Now);
            base.OnSuccess(args);
            Log.Write(args);
        }
        
*/
        
private
 
string
 _msg 
=
 
string
.Empty;
        
public
 PostsAttribute(
string
 message) {
            _msg 
=
 message;
        }
        
public
 
override
 
void
 OnEntry(MethodExecutionEventArgs args)
        {
            Console.WriteLine(
"
...{0}...onEntry......
"
, DateTime.Now);
            
base
.OnEntry(args);
        }
        
public
 
override
 
void
 OnExit(MethodExecutionEventArgs args)
        {
            Console.WriteLine(
"
...{0}...OnExit......
"
 , DateTime.Now);
            
base
.OnExit(args);
        }
    }

准备就绪后使用:

ContractedBlock.gif
ExpandedBlockStart.gif
如何调用:
    
class
 Start
    {
        
static
 
void
 Main() {
            Speak(
"
我开始哈
"
);
            EndSpeak();
            Console.ReadKey();
        }
        [Posts(
"
开始说话了..
"
)]
        
private
 
static
 
void
 Speak(
string
 message) {
            Console.WriteLine(
"
.{0}.....正式执行了....
"
, message);
        }
        [Posts(
"
error:
"
)]
        [onException(
"
endspeak
"
)]
        
static
 
void
 EndSpeak() {
            Console.WriteLine(
"
会发生错误的调用......
"
);
            
throw
 
new
 Exception(
"
====== 这是故意发生的错误.===
"
);
        }
    }

运行结果:
postsharp.jpg
完整的 test 见源文件:

转载于:https://www.cnblogs.com/worfdream/archive/2010/07/05/1771119.html

你可能感兴趣的文章
软件开发文档以及项目开发流程理解
查看>>
2019微软Power BI 每月功能更新系列——Power BI 4月版本功能完整解读
查看>>
truncate 、delete、drop的区别
查看>>
DynamoDB 中的限制
查看>>
mysql做主从配置
查看>>
Docker练习例子:基于 VNCServer + noVNC 构建 Docker 桌面系统
查看>>
《码出高效 Java开发手册》第六章 数据结构与集合
查看>>
软件工程-读书笔记(1-3章)
查看>>
iOS 电话在后台运行时,我的启动图片被压缩
查看>>
初学者可能不知道的vue技巧
查看>>
Python HDB3 AMI 编码与解码
查看>>
jquery,fn,extend和jquery.extend
查看>>
js奇葩错误
查看>>
poj 3974 Palindrome
查看>>
等比例缩放图片
查看>>
实现笛卡尔心形线的重复循环绘制
查看>>
实验报告四
查看>>
JS学习笔记——标准对象
查看>>
南柯一梦
查看>>
生产者与消费者——厨师和消费者之间的问题
查看>>