C# 日志记录的扩展方法。好主意?

C# 日志记录的扩展方法。好主意?,c#,string,logging,extension-methods,C#,String,Logging,Extension Methods,您认为以下扩展方法的优点/缺点是什么 static class Log { public static string AddToLog(this string input) { Console.WriteLine(input); return input; } public static string AddToLog(this string input, string format) { Console.

您认为以下扩展方法的优点/缺点是什么

static class Log
{
    public static string AddToLog(this string input)
    {
        Console.WriteLine(input);
        return input;
    }

    public static string AddToLog(this string input, string format)
    {
        Console.WriteLine(format, input);
        return input;
    }
}
使用场景:

class Program
{
    static void Main(string[] args)
    {
        string tableName = "Bills".AddToLog("Default table name is {0}");

        "Starting...".AddToLog();
        "Creating table".AddToLog();
    }
}

首先,它们是静态的,这将使测试变得更加困难,并且将所有东西紧密地结合在一起

我个人也认为

Logger.Write("Starting..");
这比你想象的更容易理解

"Starting...".AddToLog();

首先,它们是静态的,这将使测试变得更加困难,并且将所有东西紧密地结合在一起

我个人也认为

Logger.Write("Starting..");
这比你想象的更容易理解

"Starting...".AddToLog();

对我来说,它不是很可读


仅仅因为你可以,并不意味着你应该:)

对我来说,它不是很可读


仅仅因为你可以,并不意味着你应该:)

我不会接受一个好主意。我想不出有什么理由这样做。它使名称空间杂乱无章,而且不是很直观。(至少对我来说)

编辑


现在我想起来了,我看到一些人主张扩展这样的简单对象,但logger不是一个好例子。如果您提供的是.ToX()功能,比如将整数转换为MPH字符串或类似的功能,那么扩展方法可能会很有用,但记录器并不适合使用。

我会选择一个不好的主意。我想不出有什么理由这样做。它使名称空间杂乱无章,而且不是很直观。(至少对我来说)

编辑


现在我想起来了,我看到一些人主张扩展这样的简单对象,但logger不是一个好例子。如果您提供了.ToX()功能,例如将整数转换为MPH字符串或类似的功能,那么扩展方法可能会很有用,但记录器并不适合使用。

通常情况下,您需要调用实际的日志机制,而不是
控制台。WriteLine

您的日志API(如果您正在使用)不仅可以记录字符串,还可以记录任何类型的对象。
例如,在log4net中,您可以使用对象参数调用
.Error
方法。 然后,日志机制决定要实际记录的对象信息


您这样做的方式与此想法背道而驰。

通常不是控制台。WriteLine您可以调用实际的日志机制

您的日志API(如果您正在使用)不仅可以记录字符串,还可以记录任何类型的对象。
例如,在log4net中,您可以使用对象参数调用
.Error
方法。 然后,日志机制决定要实际记录的对象信息


你这样做的方式打破了这个想法。

这就产生了有趣的、类似ruby的语法。然而,正如约翰所说,仅仅因为你可以,并不意味着你应该

这会让大多数C#开发者感到困惑,并增加不必要的困惑


对于日志记录的特定目的,有更好的方法来获取您想要的内容。我的第一个问题是,为什么要推出自己的日志解决方案?日志记录是一个解决得很好的问题,您不应该把开发周期浪费在某些事情上,例如log4net,它做得很好。

这就产生了有趣的、类似ruby的语法。然而,正如约翰所说,仅仅因为你可以,并不意味着你应该

这会让大多数C#开发者感到困惑,并增加不必要的困惑


对于日志记录的特定目的,有更好的方法来获取您想要的内容。我的第一个问题是,为什么要推出自己的日志解决方案?日志记录是一个解决得很好的问题,您不应该将开发周期浪费在某些事情上,例如log4net,它做得很好。

要正确记录日志,您需要的不仅仅是一些字符串。日期、来源、类别等,您可能希望以更结构化的方式存储


总而言之,在字符串上创建日志扩展方法感觉完全错误。根据单一责任原则,扩展方法的功能应该与它所操作的类型有相当强的关联。在您描述的情况下,这显然被违反了。

要正确记录日志,您需要的不仅仅是一些字符串。日期、来源、类别等,您可能希望以更结构化的方式存储


总而言之,在字符串上创建日志扩展方法感觉完全错误。根据单一责任原则,扩展方法的功能应该与它所操作的类型有相当强的关联。在您描述的情况下,这显然被违反了。

这种方法的最大问题是几乎不可能非常干净地将依赖项注入静态/扩展方法。这意味着您的日志解决方案(假定它比将内容转储到stdout/console/debug更复杂)必须进行旋转和配置,以便在项目上执行任何类型的测试。这种方法的最大问题是几乎不可能将依赖关系非常干净地注入到静态/扩展方法中。这意味着您的日志解决方案(假定它比将内容转储到stdout/console/debug更复杂)必须进行旋转和配置,以便在项目上执行任何类型的测试。曾经。

附议。。。为什么不添加日志(“你好,世界!”)。。。您认为这种方法的优点是什么?我认为
Trace.WriteLine
Console.WriteLine
在这种情况下更合适。看看NLog、log4net或其他许多日志库中的一个。除非你能添加重要的功能,否则不要重新发明轮子。
Console.WriteLine
只是为了展示一些东西。实际的逻辑可以是任何辅助的东西。。。为什么不添加日志(“你好,世界!”)。。。您认为您的方法的优点是什么?我认为
跟踪.WriteLine
控制台.WriteLine
更适合这种情况。请看NLog、log4net或其他多种方法中的一种