Какой самый эффективный способ перехватить и игнорировать вызов метода при определенном условии? - PullRequest
0 голосов
/ 15 марта 2012

У меня есть класс Logger с рядом статических методов для регистрации различных действий пользователей. Что-то вроде:

public static class Logger
{
    public static void FileDownload(int fileId, int userId) 
    {
        // Do stuff
    }

    // ... and a number of similar additional methods
}

Итак, я пришел к выводу, что я хочу игнорировать запись активности для пользователей определенной роли.

У меня была идея, чтобы избежать переписывания большого количества кода и для целей DRY, заключалась в реализации пользовательского атрибута, который я могу использовать в классе Logger, который будет при каждом вызове метода проверять, Пользователь находится в определенной роли, и в этом случае я хочу полностью игнорировать вызов метода.

Проблема, которую я не могу обернуть, заключается в том, как перехватить и прервать вызов метода в моем атрибуте.

Возможно ли это, или есть какой-то другой более эффективный способ перехватить вызов метода и игнорировать его, если определенное условие истинно?

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Способ сделать это эффективно и 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();

... и все готово!Простой, эффективный, СУХОЙ и элегантный.

0 голосов
/ 15 марта 2012

В общем, ваше ведение журнала должно быть завершено, и приложение отчетности должно решить, как отображать действия в зависимости от типов пользователей.Тем не менее, однако (и я уверен, что у вас есть веская причина сделать «если тогда еще»), этого можно добиться, создав общий метод ведения журнала (logMessage)

int t = User.LogRequired? logMessage(<parameters here>) : 0;
0 голосов
/ 15 марта 2012

Почему бы просто не проверить перед тем, как что-то регистрировать?

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
 }
}

Таким образом, вам не нужно аннотировать код каким-либо особым образом (что, вероятно, в любом случае невозможно, так как те же методы, вероятно, будутиспользуется всеми видами пользователей).

...