使用委托或接口来分离日志记录 - 最佳实践 - C#

Nav*_*K N 4 c# delegates interface

我的解决方案有几个项目,包括几个库和一个UI项目.目前它是一个Windows窗体应用程序,我使用log4net进行日志记录.此UI项目仅引用log4net,此项目维护配置文件.但我也希望从我的库中登录.

通常用于执行此操作的方法是将日志记录调用包装在接口后面.创建一个名为utilities的公共项目,并将此接口添加到此项目中.现在,该项目可用于所有项目,并可使用此接口进行日志记录.

我正在考虑一种替代设计,它涉及传递代理并减少耦合并避免不必要的接口.

考虑以下课程来自我的图书馆.

public sealed class Foo
{
    Action<string> log;
    Action<string, Exception> logException;

    public Foo(Action<string> log, Action<string,Exception> logException)
    {
        this.log = log;
        this.logException = logException;
    }

    public void Work()
    {
        WL("Starting work");
        WL("Completed step1");
        .........
    }

    void WL(string message)
    {
        if(log != null) log(message);
    }

    void WL(string message, Exception exception)
    {
        if(logException != null) logException(message, exception);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在从调用代码,我可以轻松地传递日志记录方法.就像是

Foo foo = new Foo(message => Console.WriteLine(message), 
                (message, exception) => Console.WriteLine("{0},{1}", message, exception));
foo.Work();
Run Code Online (Sandbox Code Playgroud)

使用控制台进行解释,实际上我将在这里使用日志代码.

1 - 你认为这是一个更好的解决方案吗?我认为这更好,因为它更松散耦合.

2 - 还有其他更好的解决方案吗?

是我在这里找到的唯一相关问题

有什么想法吗...?

Jef*_*tin 7

如果有多个签名在紧密编队中飞行,请不要使用代表.您所做的只是避免定义有意义的和接口.log4net提供了一个ILog接口,它是您可以传递的简单包装器接口的绝佳示例.

如果您要使用日志框架,尤其是log4net,请不要包装它,也不要创建单个全局(静态OR单例)入口点.我以前写过这篇文章,你也可能对最佳实践的问题感兴趣.