【问题标题】:How to log a specific statement while using PostSharp?使用 PostSharp 时如何记录特定语句?
【发布时间】:2015-05-18 17:48:16
【问题描述】:

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

场景:

  • 在进入和退出时记录方法。

  • 在方法中记录开发者指定的语句。

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

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

选项:

  1. 创建另一个将记录参数的方面 (LogStatementAspect),现在调用它 记录语句时的方法。
  2. 使用一种名为“LogThis”的方法创建一个接口,并在 程序集专门为“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
}

【问题讨论】:

    标签: c# aop postsharp


    【解决方案1】:

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

    如果您要记录的特定语句也是一个方法调用,那么您应该能够在该调用的方法上应用相同的方面。即使方法在您没有源代码的外部程序集中,您也可以应用方面。在这种情况下,您需要在程序集中应用方面时设置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
        }   
    }
    

    【讨论】:

    • 感谢您的回答。我想可能是这样。我只是想减少我的依赖。我有一个想法,稍后我将尝试实施。我希望创建一个特定于方法名称(LogThis)的方面。方法 (LogThis) 将存在于接口中,我的所有类都将继承此接口。所以希望通过这样做每个类都会有 LogThis 方法,但方法中不需要代码。该方面实际上将通过识别方法来进行日志记录。我不确定这是否可行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2012-01-02
    相关资源
    最近更新 更多