如何将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
我可以想到两种方法来实现它:(很抱歉,在我的国家现在是凌晨1:50…)
-
将
ILog
更改为ILog<T>
,然后将其注册为Open Generic -
使用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
类,并且从未回头看。