当前第2页 返回上一页
1 2 3 4 5 6 7 8 9 10 11 12 13 | [Serializable]
[MulticastAttributeUsage(MulticastTargets.Method)] public class TimingAttribute : PostSharp.Aspects.OnMethodBoundaryAspect
{
[NonSerialized]
Stopwatch _StopWatch; public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args)
{
_StopWatch = Stopwatch.StartNew(); base.OnEntry(args);
} public override void OnExit(PostSharp.Aspects.MethodExecutionArgs args)
{
Console.WriteLine(string.Format( "[{0}] took {1}ms to execute" , new StackTrace().GetFrame(1).GetMethod().Name,
_StopWatch.ElapsedMilliseconds)); base.OnExit(args);
}
}
|
事务处理的Aspect类代码如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [Serializable]
[AspectTypeDependency(AspectDependencyAction.Order, AspectDependencyPosition.After, typeof(LogAttribute))] public class RunInTransactionAttribute : OnMethodBoundaryAspect
{
[NonSerialized]
TransactionScope TransactionScope; public override void OnEntry(MethodExecutionArgs args)
{ this.TransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew);
} public override void OnSuccess(MethodExecutionArgs args)
{ this.TransactionScope.Complete();
} public override void OnException(MethodExecutionArgs args)
{
args.FlowBehavior = FlowBehavior.Continue;
Transaction.Current.Rollback();
Console.WriteLine( "Transaction Was Unsuccessful!" );
} public override void OnExit(MethodExecutionArgs args)
{ this.TransactionScope.Dispose();
}
}
|
下面是几个Aspect类的切面处理代码,如下所示。
1 2 3 4 5 6 7 8 9 | [Exception]
[Log] static void Calc()
{ throw new pideByZeroException( "A Math Error Occured..." );
}
[Log, Timing] static void LongRunningCalc()
{
Thread.Sleep(1000);
}
|
从上面我们可以看到,常规的异常处理、日志处理都已经通过Attribute的方式进行处理了,在函数体里面都只是剩下具体的业务逻辑代码了,这样极大提高了代码的可读性,简洁明了。
运行上面的代码函数的调用,我们可以在输出日志里面看到具体的结果内容。
1 2 3 4 5 6 7 8 9 | Entering [ Void Calc() ] ...
“System.pideByZeroException”类型的第一次机会异常在 PostSharpExample.exe 中发生
Exception in :[Void Calc()] , Message:[A Math Error Occured...]
Leaving [ Void Calc() ] ...
Entering [ Void LongRunningCalc() ] ...
Leaving [ Void LongRunningCalc() ] ...
[LongRunningCalc] took 1002ms to execute
|
这样,通过声明的方式,就实现了常规日志 、异常的处理,当然实际项目上使用日志、异常处理的这些代码肯定会更加复杂一些,不过小例子已经实现了切面逻辑的分离处理了,尘归尘、土归土,一切都是那么的简洁安静了。
以上就是在.NET项目中使用PostSharp的详细内容!
返回前面的内容
相关阅读 >>
c#高级编程(一)-.net体系结构
详细了解在.net core 上运行的wordpress
.net通过字典给类赋值实现代码
c#中匿名对象与var以及动态类型 dynamic的详解
c# md5hash的用法及实例
c#中关于foreach遍历使用的深入理解
c#中关于dictionary的用法详解
.net mvc 连接数据本地数据库三种方法总结
c#中在构造函数中访问虚成员有什么问题?
c#多线程之semaphore的使用详解
更多相关阅读请进入《PostSharp》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » 在.NET项目中使用PostSharp