在特定条件下拦截和忽略方法调用的最有效方法是什么

本文关键字:方法 调用 是什么 有效 条件下 | 更新日期: 2023-09-27 18:28:00

我有一个类Logger,它包含许多用于各种用户活动日志记录的静态方法。类似于:

public static class Logger
{
    public static void FileDownload(int fileId, int userId) 
    {
        // Do stuff
    }
    // ... and a number of similar additional methods
}

所以我现在想忽略为某个角色的用户记录活动。

为了避免重写大量代码,并且为了DRY的目的,我的想法是实现一个可以在Logger类上使用的自定义属性,该属性将在每次方法调用时验证用户是否处于特定角色,在这种情况下,我希望完全忽略方法调用。

我无法理解的问题是如何拦截和中止属性中的方法调用。

如果某个条件为真,是否有其他更有效的方法可以拦截方法调用并忽略它?

在特定条件下拦截和忽略方法调用的最有效方法是什么

DRY中有效地做到这一点的一种方法是将这些方法从static更改为实例方法,然后从类Logger继承并覆盖其方法以不执行任何操作。

你的Logger类现在看起来是这样的:

public class Logger
{
    public virtual void FileDownload(int fileId, int userId) 
    {
        // Do stuff
    }
    // ... and a number of similar additional methods
}

子类将如下所示:

public class IdleLogger : Logger
{
    public override void FileDownload(int fileId, int userId) 
    {
        // Do NOTHING
    }
    // ... and a number of similar additional methods
}

然后你可以说:

var myLogger =  IsUserInNoLoggingRole  ? new IdleLogger() : new Logger();

你完了!简单、高效、干燥、优雅。

通常情况下,日志记录应该是完整的,这取决于报告应用程序需要根据用户类型来决定显示活动。也就是说,然而(我相信你有充分的理由这样做"如果然后其他")这可以通过创建一个通用的日志记录方法(logMessage)来实现

int t = User.LogRequired? logMessage(<parameters here>) : 0;

为什么不在实际记录任何内容之前简单地进行检查?

public static class Logger
{
 public void LogSensetiveInformation(string message)
 {
  if (!AllowedLogging(HttpContext.Current)
  {
    return;
  }
  LogMessage(message);// write message to some storage
 }
 public void Log(string message)
 {
  LogMessage(message);// write message to some storage
 }
}

通过这种方式,您不需要以任何特殊的方式对代码进行注释(这可能无论如何都不可能,因为所有类型的用户都可能使用相同的方法)。