使用postsharp将方面应用于方面

时间:2013-10-02 10:03:34

标签: c# .net postsharp

我正在研究使用post sharp,我正在尝试整理一些演示。其中一个是记录异常的方面,另一个是检查空参数并在遇到异常时抛出异常。

我遇到的问题是我希望我的异常日志记录方面记录null检查方面抛出的异常。它似乎没有工作。有没有人知道如何使这项工作?

编辑:要清楚,异常记录器正在处理在方面之外抛出的异常,但是没有记录NullCheckAttribute上的异常

空检查方面的代码如下

[Serializable]
public class NullCheckAttribute : OnMethodBoundaryAspect
{
    [ExceptionLogger]
    public override void OnEntry(MethodExecutionArgs args)
    {
        foreach (var argument in args.Arguments)
        {
            if (argument == null)
                throw new InvalidOperationException("Null argument in " + args.Method.Name);
        }
    }
}

异常记录器的代码

[Serializable]
public class ExceptionLoggerAttribute : OnMethodBoundaryAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("Exception thrown in " + args.Method.Name);
        Console.WriteLine("***Message: " + args.Exception.Message);
        Console.WriteLine("***Stack trace: " + args.Exception.StackTrace);
    }
}

我还应该提一下,我只是使用免费许可证。

1 个答案:

答案 0 :(得分:7)

PostSharp不允许您在方面类上应用方面,这是您在[ExceptionLogger]类中应用NullCheckAttribute时尝试执行的操作。

目前,如果在方面类上检测到方面属性,则会以静默方式忽略它。它的行为方式是这样的,因为大多数时候这个应用程序是无意的(通过多播)。

实现所需效果的正确方法(记录空检查引发的异常)是将两个属性应用于目标方法。另外,请记住,应用属性的顺序很重要。如果您为此示例更改它,那么您将看不到您的日志消息 - 因为将在异常记录器引入的try / catch之前执行空检查。

    [ExceptionLogger(AspectPriority = 1)]
    [NullCheck(AspectPriority = 2)]
    private void TestMethod(string s)
    {
        Console.WriteLine(s);
    }