2012-03-15 46 views
0

我有一个类Logger与各种用户活动记录的静态方法。喜欢的东西:在某种情况下拦截和忽略方法调用的最有效方法是什么?

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

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

所以我已经到现在,我想忽略记录该活动的某角色的用户。

为避免重写大量代码和DRY的目的,我的想法是实现一个自定义属性,我可以在Logger类上使用该属性,对于每个方法调用,都将验证用户有一定的作用,在这种情况下,我想完全忽略方法调用。

我无法包裹头部的问题是如何拦截并中止我的属性中的方法调用。

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

+0

没有实现,C#不提供机制的ad-hoc方法拦截AOP。 – 2012-03-15 17:04:51

+0

这看起来像一个非常类似的提问/回答: http://stackoverflow.com/questions/4502134/using-attributes-to-intercept-then-reissue-method-calls – gymbrall 2012-03-15 17:06:47

+0

@gymbrall它的确,唐我不知道自己是如何错过它的,一直在寻找它。谢谢! – 2012-03-15 17:11:31

回答

2

有效地做到这一点的方法和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(); 

...你完成了!简单,高效,干爽优雅。

+1

+1:根据用户设置每个请求的记录器。在HttpContext.Current.Items中缓存可能有用,或者使用依赖注入容器,该容器可以配置为按请求返回不同的实例。 – 2012-03-15 17:18:41

+1

我喜欢这种方法。我想我可以实例化记录器并将其保存在我的SecurityContext中以简化操作。 – 2012-03-15 17:27:14

+0

在多用户环境中就是这种情况,这种方法是否会创建更多(不是必需的)记录器实例?或者我错过了显而易见的? – Krishna 2012-03-16 07:51:47

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

这样,你不需要任何特殊的方式来注释代码(这可能不可能的,因为反正同样的方法很可能是由各种不同的用户使用)。

+0

感谢您的回答!我想使用属性或类似的原因是为了不必在每种方法中进行检查。 – 2012-03-15 17:38:20

+0

您只需要将检查添加到记录器本身,您的常规代码将保持不变。我更喜欢迭戈的答案,因为更通用。 – 2012-03-15 18:35:47

0

一般而言,您的日志记录应该是完整的,取决于需要根据用户类型决定显示活动的报告应用程序。这么说,但是,(我相信你有正当的理由做“如果当时其他”),这可以通过创建一个共同的测井方法(的LogMessage)

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