我有两个接口ILogger
和ILogger<T>
,后者继承自前者。一些班级Handler
喜欢:
public class Handler
{
public Handler(ILogger logger)
{
}
}
我想告诉Autofac
要解决并传递ILogger<T>
而不是ILogger
。假设我可以解析ILogger
和ILogger<T>
的实例,这不是问题所在。
我知道我可以通过以下方式传递一个实例:
builder.RegisterType<Handler>()
.AsSelf() // assume any other suplerfluos config is also done
.WithParameter(...);
有3次重载(至少在我的Autofac
版本上),但是其中3个都以某种方式暗示使用实例作为参数。
我想做点什么:.WithParameter(typeOf(ILogger<Handler>))
有没有办法做到这一点?
答案 0 :(得分:1)
这可以使用注册事件来完成。
/// <summary>
/// DI registrations for loggers.
/// </summary>
public class LoggersModule : IModule
{
public void Configure(IComponentRegistry componentRegistry)
{
componentRegistry.Registered += (sender, e) =>
e.ComponentRegistration.Preparing += OnComponentPreparing;
}
private static void OnComponentPreparing(object sender, PreparingEventArgs e)
{
var t = e.Component.Activator.LimitType;
e.Parameters = e.Parameters.Union(new[]
{
new ResolvedParameter(
(p, i) => p.ParameterType == typeof(ILogger),
(p, i) => LoggerFactory.GetLoggerForClass(t))
});
}
}
LoggerFactory.GetLoggerForClass()
基本上创建ILogger<T>
的实例。