如何将autofacc连接到Common.Logging

本文关键字:Common Logging 连接 autofacc | 更新日期: 2023-09-27 18:07:41

我有一个这样的类:

public class LoggedFoo
{
    private readonly ILog _logger;
    public LoggedFoo(ILog logger)
    {
        this._logger = logger;
    }
    public DoStuff()
    {
        this._logger.Info(i => i("Doing stuff..."));
    }
}

业务需求之一是正在为某些功能生成日志,因此我很自然地想模拟出ILog来验证。

然而,

常见。日志库支持基于类型的日志记录器,如下所示:

var logger = LogManager.GetLogger<LoggedFoo>();

……或者:

var logger = LogManager.GetLogger(typeof(LoggedFoo));

问题是,我们正在使用AutoFac进行依赖注入,我不知道如何实例化一个ILog基于被实例化注入的类。

我怎么写这个?我用的是最新的Nuget版本的AutoFac

如何将autofacc连接到Common.Logging

我可以想到两种方法来实现它:(很抱歉,在我的国家现在是凌晨1:50…)

  1. ILog更改为ILog<T>,然后将其注册为Open Generic

  2. 使用Dynamic-Providers,它允许你使用上下文解析

Autofac的网站有一个例子,似乎是你正在寻找的确切的东西。

使用上下文解析依赖关系:

private static void OnComponentPreparing(object sender, PreparingEventArgs e)
{
    var t = e.Component.Target.Activator.LimitType;
    e.Parameters = e.Parameters.Union(
    new[]
    {
      new ResolvedParameter((p, i) => p.ParameterType == typeof(ILog), 
                            (p, i) => LogManager.GetLogger(t)),
    });
}

附加:

protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
    // Handle constructor parameters.
    registration.Preparing += OnComponentPreparing;
    // Handle properties.
    registration.Activated += (sender, e) => InjectLoggerProperties(e.Instance);
}

所以最近我决定最好的方法不是注入ILog接口,而是ILogManager接口,像这样:

public class Foo
{
    private readonly ILog _logger;
    public Foo(ILogManager logManager)
    {
        _logger = logManager.GetLogger<Foo>();
    }
}

通过这样做,我省去了许多必须弄清楚需要引用哪个记录器的麻烦。我用SingleInstance的生命周期定义了一次ILogManager类,并且从未回头看。