如何记录一个特定的语句,而使用PostSharp

本文关键字:语句 PostSharp 一个 何记录 记录 | 更新日期: 2023-09-27 17:49:46

我尝试PostSharp AOP已经有一段时间了。我能够设计简单的方面,并使用他们很好。但我正在努力寻找实现这一目标的最佳方法。

场景:

  • 记录进入和退出的方法

  • 记录开发人员在方法中指定的语句

假设我已经构建了一个Apsect(LogMethodAspect),用于在进入和退出期间记录方法。

但是,现在我想记录一个特定的语句。我希望这条语句是同一日志的一部分。

选项:

  1. 创建另一个方面(LogStatementAspect)来记录参数,现在调用它方法。
  2. 创建一个名为"LogThis"的方法的接口
  3. 为"LogThis"方法指定一个方面。

我试图找到一个合适的方法,这样它将需要最少的依赖。

可以在语句上创建方面吗?你能直接调用底层的Aspect方法吗?

请帮忙就太好了。

示例伪代码:

[LogMethodAspect]
Mothod1 (input1, input2)
{
   Do Something
   "Log this info" // How can I re-use the logging methodology already created in the aspect - LogMethodAspect

   Do Something more
}

如何记录一个特定的语句,而使用PostSharp

一般来说,不可能将方面应用于方法中的特定语句。此外,方面应该是与应用程序逻辑正交的,因此方法中的代码不应该通过直接方法调用与应用于该方法的方面耦合。

如果您想要记录的特定语句也是一个方法调用,那么您应该能够在被调用的方法上应用相同的方面。即使方法位于没有源代码的外部程序集中,也可以应用方面。在这种情况下,您需要在程序集中应用方面时设置AttributeTargetAssemblies属性:

[assembly:LogMethodAspect(AttributeTargetAssemblies="SomeAssemblyName", AttributeTargetTypes = "...")]

如果你想记录的不是一个方法调用而是一些任意的信息,我建议实现一个底层日志记录提供程序,它将从方面和代码中需要记录额外信息的点调用。

public interface ILogger
{
    void Log(string message);
}
[Serializable]
public class LogMethodAspect : OnMethodBoundaryAspect
{
    private ILogger logger;
    public override void RuntimeInitialize(MethodBase method)
    {
        this.logger = // get the shared logger instance
    }
    public override void OnEntry(MethodExecutionArgs args)
    {
        // ...
        this.logger.Log("Entering: " + method_name + arg_values);
    }
}
class Class1
{
    [LogMethodAspect]
    void Method1 (input1, input2)
    {
        // Do Something
        // using the same shared logger
        logger.Log("Log this info")
        // Do Something more
    }   
}