如何将AutoFac连接到Common.Logging?

时间:2015-08-12 20:37:04

标签: c# unit-testing dependency-injection mocking autofac

我有一个类似的课程:

public class LoggedFoo
{
    private readonly ILog _logger;

    public LoggedFoo(ILog logger)
    {
        this._logger = logger;
    }

    public DoStuff()
    {
        this._logger.Info(i => i("Doing stuff..."));
    }
}

其中一项业务要求是为某些功能生成日志,因此我自然想要模拟ILog进行验证。

但是,Common.Logging库支持基于类型的记录器,类似于:

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

...或:

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

问题是,我们使用AutoFac进行依赖注入,我无法弄清楚如何基于正在实例化注入的类来实例化ILog

我该怎么写?我正在使用最新的Nuget版本的AutoFac。

2 个答案:

答案 0 :(得分:5)

我可以想出两种方法来实现它:(很抱歉,我国的凌晨1点50分......)

  1. 将您的heat_index更改为ILog,然后将其注册为Open Generic

  2. 使用Dynamic-Providers可以解析上下文。

  3. ILog<T>的网站有一个example,这似乎是您正在寻找的确切内容。

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

    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)),
        });
    }
    

答案 1 :(得分:0)

所以最近我决定最好的方法是不要注入ILog接口,而是注入ILogManager接口,如下所示:

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

通过这样做,我削减了许多必要的头部划痕,以确定需要引用哪个记录器。我在ILogManager生命周期内定义了一次SingleInstance课程,但从未回头过。