【发布时间】:2020-01-02 17:37:48
【问题描述】:
我浏览了 Stack Overflow 以了解如何登录我的 C# 应用程序并保持特定于我的应用程序的使用要求。之前已回答的以下问题对我有所帮助:
- Implementation and usage of logger wrapper for log4net
- Logger wrapper best practice
- log4net with DI Simple Injector
这些实现似乎希望我将 log4net.ILog 传递给我的实现的构造函数或 log4net 的 LogImpl 的基本实现。但是,我在使用 Simple Injector 配置抽象记录器时遇到了问题。
在我看来,我的实现运行良好,但我不知道可能存在哪些缺点,或者可能有其他方法。
到目前为止我的收获
- 我有一个需要
void Log(LogEntry entry)方法的ILogger接口。 - 一个适配器(我从上面引用的来源改编它)-
public class Log4netAdapter<T> : ILogger - DI 容器 Simple Injector 具有以下注册:
源代码
简单的注射器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。
【问题讨论】:
-
我投票结束这个问题,因为它属于代码审查堆栈交换codereview.stackexchange.com
标签: c# dependency-injection simple-injector