inversion-of-control - 将结构映射与 log4net 包装器一起使用

标签 inversion-of-control structuremap

我有以下界面:

public interface ILogger
{
    void Debug(string message, params object[] values);
    void Info(string message, params object[] values);
    void Warn(string message, params object[] values);
    void Error(string message, params object[] values);
    void Fatal(string message, params object[] values);
}

以及以下实现:
public class Log4netLogger : ILogger
{
    private ILog _log;

    public Log4netLogger(Type type)
    {
        _log = LogManager.GetLogger(type);
    }

    public void Debug(string message, params object[] values)
    {
        _log.DebugFormat(message, values);
    }

    // other logging methods here...

}

我的想法是使用结构映射来实例化 Log4netLogger 类,并使用执行日志记录的类的类型。但是,我一生都无法弄清楚如何将调用类的类型传递给结构映射,以便可以将其传递给日志实现的构造函数。任何关于如何做到这一点(或更好的方法)的建议将不胜感激。

最佳答案

我们在 log4net 周围使用类似的 ILogger 包装器,并且通常使用构造函数注入(inject)。我们使用拦截器作为负责创建 Logger 的工厂方法。这是我们用于日志记录设置的典型注册表。

public class CommonsRegistry : Registry
{
    public CommonsRegistry()
    {
        For<ILogger>()
            .AlwaysUnique()
            .TheDefault.Is.ConstructedBy(s =>
            {
                if (s.ParentType == null)
                    return new Log4NetLogger(s.BuildStack.Current.ConcreteType);

                return new Log4NetLogger(s.ParentType);
            });

        var applicationPath = Path.GetDirectoryName(Assembly.GetAssembly(GetType()).Location);
        var configFile = new FileInfo(Path.Combine(applicationPath, "log4net.config"));
        XmlConfigurator.ConfigureAndWatch(configFile);
    }
}

当依赖于具体类型时,父类型空检查是必要的。

其余的是可选的 log4net 设置内容。

我喜欢这个设置的一件事是能够使用空记录器进行单元测试。

关于inversion-of-control - 将结构映射与 log4net 包装器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1942900/

相关文章:

c# - 在某些情况下使用 StructureMap 向构造函数注入(inject)不同的对象

.net - 如何在代码中定义 Structuremap 命名实例

java - 如何使用 Spring 4 Autowiring 泛型类?

c# - 如何彻底解决IoC循环引用?

c# - 将对象属性转换为不同的可视对象

java - 无法让 Autowired 工作或进行组件扫描

nhibernate - 使用 asp mvc 2 和 nhibernate 的单个网站多个​​连接字符串

design-patterns - 处理 IOC 中的循环依赖

c# - 无法使用 StructureMap 从私有(private)或内部构造函数调用 BuildUp