记录的扩展方法。一个好主意?

时间:2010-08-19 16:31:25

标签: 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.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();
    }
}

7 个答案:

答案 0 :(得分:11)

他们一开始就是静态的,这将使测试变得更加困难,并且会更紧密地结合所有内容。

我个人也认为像

Logger.Write("Starting..");

更容易理解
"Starting...".AddToLog();

答案 1 :(得分:2)

对我来说,它不太可读。

仅仅因为你不能意味着你应该:)

答案 2 :(得分:2)

这使得有趣的,类似ruby的语法。然而,就像约翰所说的那样,仅仅因为你并不意味着你应该这样做。

这会让大多数C#开发人员感到困惑,并增加了不必要的混淆。

对于日志记录的特定目的,有更好的方法来获得您想要的东西。我的第一个问题是,为什么要推出自己的日志记录解决方案?记录是一个非常好解决的问题,你不应该浪费开发周期,例如log4net就可以了。

答案 3 :(得分:1)

我不会有好主意。我想不出有任何理由这样做。它使命名空间变得混乱,并且不是很直观。 (至少对我而言)

修改

现在我想到了,我看到一些倡导者扩展这样的简单对象,但记录器不是一个好的情况恕我直言。如果您提供.ToX()功能,例如将整数转换为MPH字符串或类似的东西,则扩展方法可能很有用,但记录器不太合适。

答案 4 :(得分:1)

通常而不是Console.WriteLine,您可以调用实际的日志记录机制

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

你做到这一点的方式就失败了。

答案 5 :(得分:1)

为了正确记录,您需要的不仅仅是一些字符串。日期,来源,类别等,您可能希望以更有条理的方式存储。

总而言之,在String上创建日志记录扩展方法感觉完全错误。根据单一责任原则,扩展方法的功能应与其运行的类型具有相当强的关联。在您描述的情况下,这显然是违反的。

答案 6 :(得分:1)

这种方法中最大的问题是几乎不可能非常干净地将依赖项注入静态/扩展方法。这意味着您的日志记录解决方案(假设它变得比将事情转储到stdout / console / debug更复杂)必须被调整并配置为对项目执行任何类型的测试。如初。