在.NET项目中使用PostSharp


当前第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()

{            //wait for 1000 miliseconds

    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》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...