使用AOP记录不起作用

时间:2016-07-14 07:00:35

标签: c# aop

我有一个TraceAspect方法。这个类用于使用AOP进行日志记录。

 public class TracingAspect : IMessageSink
{
    internal TracingAspect(IMessageSink next)
    {
        m_next = next;
    }

    #region Private Vars
    private IMessageSink m_next;
    private String m_typeAndName;
    #endregion // Private Vars

    #region IMessageSink implementation
    public IMessageSink NextSink
    {
        get { return m_next; }
    }

    public IMessage SyncProcessMessage(IMessage msg)
    {
        Preprocess(msg);
        IMessage returnMethod = m_next.SyncProcessMessage(msg);
        PostProcess(msg, returnMethod);
        return returnMethod;
    }

    public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
    {
        throw new InvalidOperationException();
    }
    #endregion //IMessageSink implementation

    #region Helper methods
    private void Preprocess(IMessage msg)
    {
        // We only want to process method calls
        if (!(msg is IMethodMessage)) return;

        IMethodMessage call = msg as IMethodMessage;
        Type type = Type.GetType(call.TypeName);
        m_typeAndName = type.Name + "." + call.MethodName;
        NLogging.Trace("PreProcessing: " + m_typeAndName + "(");

        // Loop through the [in] parameters
        for (int i = 0; i < call.ArgCount; ++i)
        {
            if (i > 0)
                NLogging.Trace(", ");
            NLogging.Trace(call.GetArgName(i) + " = " + call.GetArg(i));
        }
        NLogging.Trace(")");
    }

    private void PostProcess(IMessage msg, IMessage msgReturn)
    {
        // We only want to process method return calls
        if (!(msg is IMethodMessage) ||
            !(msgReturn is IMethodReturnMessage)) return;

        IMethodReturnMessage retMsg = (IMethodReturnMessage)msgReturn;
        NLogging.Trace("PostProcessing: ");
        Exception e = retMsg.Exception;
        if (e != null)
        {
            NLogging.Trace("Exception was thrown: " + e);
            return;
        }

        // Loop through all the [out] parameters
        NLogging.Trace(m_typeAndName + "(");
        if (retMsg.OutArgCount > 0)
        {
            NLogging.Trace("out parameters[");
            for (int i = 0; i < retMsg.OutArgCount; ++i)
            {
                if (i > 0)
                    NLogging.Trace(", ");
                NLogging.Trace(retMsg.GetOutArgName(i) + " = " +
                              retMsg.GetOutArg(i));
            }
            NLogging.Trace("]");
        }
        if (retMsg.ReturnValue.GetType() != typeof(void))
            NLogging.Trace(" returned [" + retMsg.ReturnValue + "]");

        NLogging.Trace(")\n");
    }
    #endregion Helpers
}

public class TracingProperty : IContextProperty, IContributeObjectSink
{
    #region IContributeObjectSink implementation
    public IMessageSink GetObjectSink(MarshalByRefObject o, IMessageSink next)
    {
        return new TracingAspect(next);
    }
    #endregion // IContributeObjectSink implementation

    #region IContextProperty implementation
    public string Name
    {
        get
        {
            return "CallTracingProperty";
        }
    }
    public void Freeze(Context newContext)
    {
    }
    public bool IsNewContextOK(Context newCtx)
    {
        return true;
    }
    #endregion //IContextProperty implementation
}

[Conditional("DEBUG")]
[AttributeUsage(AttributeTargets.Class,AllowMultiple = false)]
public class TracingAttribute : ContextAttribute
{
    public TracingAttribute() : base("CallTracing") { }
    public override void GetPropertiesForNewContext(IConstructionCallMessage ccm)
    {
        ccm.ContextProperties.Add(new TracingProperty());
    }
}

另外,我有一个静态类。

[Tracing]
public static class SampleStaticClass
{
    public static string SampleStaticMethod()
    {
        return "From Static method";
    }
}

TracingAspect将适用于所有非静态方法。但它不适用于静态方法。无论如何使用AOP记录静态方法?

1 个答案:

答案 0 :(得分:0)

您可以使用AOP框架记录静态方法。

大多数编译时AOP Framework可以像PostSharp(商业)

那样进行

在我的知识中,只有一个运行时AOP框架可以执行此操作:NConcern .NET(开源)