2

我正在尝试通过 NLog 实现日志记录,并且有一些代码异味确实需要我的注意,但目前由于我的知识有限,我不确定如何处理它们。

以下是我不喜欢的东西

首先,我将 NLog 的实际实现隐藏在要与 DI 一起使用的接口后面,并且该类是单例。

目前我正在尝试记录尽可能多的信息,这意味着我正在从业务对象中的几乎每个方法调用记录器,并且我不喜欢我在 Logging 类上创建的依赖项。他们有更好的方法来记录每个方法而不是直接调用方法吗?在这里,我相信我违反了 Open Closed Principal,因为如果我更改了日志接口方法。所有的地狱都会崩溃,这种变化几乎会在每一种方法中产生涟漪。

其次,更可怕的部分是在某些情况下,我需要将一些额外的信息传递给我的记录器,例如 UserID、ProductCode 等。如果我将这些信息作为参数传递给记录器类,我什至不想考虑这条路。 .. 更有经验的人如何处理这些情况?

请提供您的反馈!

4

2 回答 2

3

您真的应该尝试使用 Aspects 进行日志记录。请参阅http://www.voelter.de/data/articles/aop/aop.html或只是谷歌“记录方面”

于 2013-09-24T13:17:50.720 回答
1

您可以以通用方式设计业务对象的内置日志记录,其中记录器可以附加到对象以接收或不接收记录事件。这样,您以后可以更改记录日志的方法,而无需更改业务对象代码。

就像是:

public interface BOLogger
{
    void Log(string message);
}

public sealed class AbstractBOLogger : BOLogger
{
    public List<BOLogger> Loggers { get; private set; }

    public AbstractBOLogger
    {
        this.Loggers = new List<BOLogger>();
    }

    public void Log(string message)
    {
        this.Loggers.ForEach(logger => logger.Log(message));
    }
}

public class BusinessObject
{
    public BOLogger { get; private set; }

    public BusinessObject
    {
        this.BOLogger = new AbstractBOLogger();
    }
}

反正是这样的。

于 2013-09-24T13:42:14.333 回答