C# 设计具有多种实现的静态记录器
目前有一种API方法可以跟踪另一个相关应用程序的日志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) {} } 随着一些设计的改变,我想介绍另一种类型的记录器,将根据特定条件激
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,我给出了一个抽象的观点。我不是在寻找其他日志库。大多数情况下,我们都会对此类系统的正确设计实现提出质疑