使用通用对象作为非通用参数的Autofac

时间:2016-07-21 21:17:34

标签: c# generics dependency-injection autofac

我有两个接口ILoggerILogger<T>,后者继承自前者。一些班级Handler喜欢:

public class Handler
{
    public Handler(ILogger logger)
    {
    }
}

我想告诉Autofac要解决并传递ILogger<T>而不是ILogger。假设我可以解析ILoggerILogger<T>的实例,这不是问题所在。

我知道我可以通过以下方式传递一个实例:

builder.RegisterType<Handler>()
       .AsSelf() // assume any other suplerfluos config is also done
       .WithParameter(...);

有3次重载(至少在我的Autofac版本上),但是其中3个都以某种方式暗示使用实例作为参数。

我想做点什么:.WithParameter(typeOf(ILogger<Handler>))

有没有办法做到这一点?

1 个答案:

答案 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>的实例。