我有一个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记录静态方法?
答案 0 :(得分:0)
您可以使用AOP框架记录静态方法。
大多数编译时AOP Framework可以像PostSharp(商业)
那样进行在我的知识中,只有一个运行时AOP框架可以执行此操作:NConcern .NET(开源)