在特定条件下拦截和忽略方法调用的最有效方法是什么
本文关键字:方法 调用 是什么 有效 条件下 | 更新日期: 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
}
}
通过这种方式,您不需要以任何特殊的方式对代码进行注释(这可能无论如何都不可能,因为所有类型的用户都可能使用相同的方法)。