使用简单注入器为Log4Net实现Logger类

问题描述 投票:1回答:1

我仔细检查了Stack Overflow,以了解如何登录C#应用程序并保持应用程序特定的使用要求。先前已回答的以下问题对我有帮助:

这些实现似乎希望我将log4net.ILog传递给实现的构造函数或log4net的LogImpl的基本实现。但是,我在使用Simple Injector配置抽象记录器时遇到了麻烦。

正如我所看到的,我的实现工作确实很好,但是我不知道可能存在一些缺点,或者可能有其他方式可以做到这一点。

到目前为止,我有什么

  • 我有一个需要ILogger方法的void Log(LogEntry entry)接口。
  • 一个适配器(我从上面引用的源中改编了它-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

我仔细检查了Stack Overflow,以了解如何登录C#应用程序并保持应用程序特定的使用要求。以下问题具有...

c# dependency-injection simple-injector
1个回答
0
投票

我想知道这是否遵循SOLID原则,还有更好的方法吗?

© www.soinside.com 2019 - 2024. All rights reserved.