我仔细检查了Stack Overflow,以了解如何登录C#应用程序并保持应用程序特定的使用要求。先前已回答的以下问题对我有帮助:
这些实现似乎希望我将log4net.ILog传递给实现的构造函数或log4net的LogImpl的基本实现。但是,我在使用Simple Injector配置抽象记录器时遇到了麻烦。
正如我所看到的,我的实现工作确实很好,但是我不知道可能存在一些缺点,或者可能有其他方式可以做到这一点。
到目前为止,我有什么
ILogger
方法的void Log(LogEntry entry)
接口。 public class Log4netAdapter<T> : ILogger
源代码
简单喷射器DI容器:
private SimpleInjector.Container container; [SetUp] public void SetUp() { // init log4net XmlConfigurator.Configure(); container = new SimpleInjector.Container(); container.RegisterConditional( typeof(ILogger), c => typeof(Log4netAdapter<>).MakeGenericType(c.Consumer.ImplementationType), Lifestyle.Singleton, c => true); }
记录器界面:
public interface ILogger { void Log(LogEntry entry); } public class Log4netAdapter<T> : ILogger { private readonly log4net.ILog Logger; public Log4netAdapter() { this.Logger = LogManager.GetLogger(typeof(T)); } public void Log(LogEntry entry) { if (entry.Severity == LoggingEventType.Debug) Logger.Debug(entry.Message, entry.Exception); else if (entry.Severity == LoggingEventType.Information) Logger.Info(entry.Message, entry.Exception); else if (entry.Severity == LoggingEventType.Warning) Logger.Warn(entry.Message, entry.Exception); else if (entry.Severity == LoggingEventType.Error) Logger.Error(entry.Message, entry.Exception); else Logger.Fatal(entry.Message, entry.Exception); } }
ILogger
的扩展名:
public static class LoggerExtensions { public static void Log(this ILogger logger, string message) { logger.Log(new LogEntry(LoggingEventType.Information, message)); } public static void Log(this ILogger logger, Exception exception) { logger.Log(new LogEntry(LoggingEventType.Error, exception.Message, exception)); } }
我想知道
我想知道这是否遵循SOLID原则,还有更好的方法吗?如果有更好的方法,那么可以通过C#的示例向我提供原因。
我不喜欢的东西
我的实现不允许我只在将Ilogger
传递给构造函数的任何类上调用特定方法。它要求我在ILogger
接口上创建扩展,然后将其重定向到我的Log4netAdapter
。
我仔细检查了Stack Overflow,以了解如何登录C#应用程序并保持应用程序特定的使用要求。以下问题具有...
我想知道这是否遵循SOLID原则,还有更好的方法吗?