Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计具有多种实现的静态记录器_C#_Logging_Design Patterns - Fatal编程技术网

C# 设计具有多种实现的静态记录器

C# 设计具有多种实现的静态记录器,c#,logging,design-patterns,C#,Logging,Design Patterns,目前有一种API方法可以跟踪另一个相关应用程序的日志 public class Logger { public static void Init() {} public static void Verbose(string msg) {} public static void Warn(string msg) {} public static void Error(string msg) {} } 随着一些设计的改变,我想介绍另一种类型的记录器,将根据特定条件激

目前有一种API方法可以跟踪另一个相关应用程序的日志

public class Logger {
    public static void Init() {}
    public static void Verbose(string msg) {}
    public static void Warn(string msg) {}
    public static void Error(string msg) {}
}
随着一些设计的改变,我想介绍另一种类型的记录器,将根据特定条件激活

protected class FileLogger {
    public static void Verbose(string msg) {}
    public static void Warn(string msg) {}
    public static void Error(string msg) {}
}

protected class ConsoleLogger {
    public static void Verbose(string msg) { //do diff}
    public static void Warn(string msg) { // do different}
    public static void Error(string msg) {}
}
记录器
已公开,可以以静态方式调用
记录器。警告(“测试”)
。在不违反合同的情况下隐藏实现的理想设计模式/实现是什么

一种简单的方法是在主
记录器中使用
if和else
,推送应该调用哪个,这似乎很模糊


由于Logger没有公开
接口
静态方法
,解决问题的
正确设计是什么?

可能您可以采用某种功能方法

例如:

public static class Logger
{
     public static Action<string> Verbose { get; set; }
     public static Action<string> Warn { get; set; }
     public static Action<string> Error { get; set; }
}
也就是说,您不需要实现为类,而需要实现为委托。您可以提供代理以登录到文件、云服务或控制台输出

我猜你被一些遗留代码所困扰,这就是为什么需要这样的解决方法

随着一些设计的改变,我想介绍另一种类型的记录器,将根据特定条件激活

protected class FileLogger {
    public static void Verbose(string msg) {}
    public static void Warn(string msg) {}
    public static void Error(string msg) {}
}

protected class ConsoleLogger {
    public static void Verbose(string msg) { //do diff}
    public static void Warn(string msg) { // do different}
    public static void Error(string msg) {}
}
根据我的建议,您应该能够通过将代理存储在某个位置来替换
操作
实施,以便将其设置为
记录器

Logger.Verbose = FileLogger.Verbose;

顺便说一句,我认为被静态方法束缚是个坏主意。。。如果一个线程需要一个日志实现,而另一个线程需要另一个日志实现,该怎么办?您可能会得到一些奇怪的解决方案…

也许您可以使用某种函数方法

例如:

public static class Logger
{
     public static Action<string> Verbose { get; set; }
     public static Action<string> Warn { get; set; }
     public static Action<string> Error { get; set; }
}
也就是说,您不需要实现为类,而需要实现为委托。您可以提供代理以登录到文件、云服务或控制台输出

我猜你被一些遗留代码所困扰,这就是为什么需要这样的解决方法

随着一些设计的改变,我想介绍另一种类型的记录器,将根据特定条件激活

protected class FileLogger {
    public static void Verbose(string msg) {}
    public static void Warn(string msg) {}
    public static void Error(string msg) {}
}

protected class ConsoleLogger {
    public static void Verbose(string msg) { //do diff}
    public static void Warn(string msg) { // do different}
    public static void Error(string msg) {}
}
根据我的建议,您应该能够通过将代理存储在某个位置来替换
操作
实施,以便将其设置为
记录器

Logger.Verbose = FileLogger.Verbose;

顺便说一句,我认为被静态方法束缚是个坏主意。。。如果一个线程需要一个日志实现,而另一个线程需要另一个日志实现,该怎么办?您将得到一些奇怪的解决方案…

如果必须使用静态解决方案,您只需制作调用非静态类型的静态方法适配器,然后在Init方法中注入实现:

public static class Logger {

    public interface ILog { 
        void Verbose(string msg);
        void Warn(string msg);
        void Error(string msg);
    }

    private static ILog Log {get; set;}

    public static void Init(ILog log) { Log = log; }
    public static void Verbose(string msg) { Log.Verbose(msg); }
    public static void Warn(string msg) { Log.Warn(msg); }
    public static void Error(string msg) { Log.Error(msg); }
}

如果您想逐渐从静态迁移到新代码中,这也使得将ILog的实现直接注入到新代码中变得容易。

如果您必须使用静态解决方案,只需制作调用非静态类型的静态方法适配器,然后在Init方法中注入实现:

public static class Logger {

    public interface ILog { 
        void Verbose(string msg);
        void Warn(string msg);
        void Error(string msg);
    }

    private static ILog Log {get; set;}

    public static void Init(ILog log) { Log = log; }
    public static void Verbose(string msg) { Log.Verbose(msg); }
    public static void Warn(string msg) { Log.Warn(msg); }
    public static void Error(string msg) { Log.Error(msg); }
}

如果您想逐渐从静态迁移出去,这也使得将ILog的实现直接注入新代码变得容易。

可能的解决方案是使用,
记录器是主体,文件记录器/控制台记录器是观察者


记录者类型“将根据特定条件激活”(将观察者连接/分离到对象)。

可能的解决方案可以使用,
记录器是主体,文件记录器/控制台记录器是观察者


记录者的类型“将根据特定条件激活”(将观察者附加/分离到主体上)。

@BRAHIMKamel,我给出了一个抽象视图。我不是在寻找其他日志库。大多数情况下,我们都会对此类产品的正确设计实现提出质疑sceanrios@BRAHIMKamel,我给出了一个抽象的观点。我不是在寻找其他日志库。大多数情况下,我们都会对此类系统的正确设计实现提出质疑