2016-07-21 2 views
0

У меня есть два интерфейса ILogger и ILogger<T>, последний наследует от прежнего. И некоторый класс Handler нравится:Autofac, используя общие объекты как не общие параметры

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

Как вы ожидаете, что это будет работать во время выполнения? Вы, конечно, не могли написать что-то подобное, что бы скомпилировать так, почему вы ожидаете, что среда выполнения будет вести себя по-другому? –

+0

Если бы я вручную создавал экземпляр «Handler», я мог бы сделать «var handler = new Handler (новый DefaultLogger ());» и это сработает. Я думал, что есть способ сделать Autofac делать это для меня всякий раз, когда я прошу обработчика. – Luiso

+0

Почему вы не просто сопоставляете 'ILogger' с' DefaultLogger () '? Или это будет 'DefaultLogger ()' для 'ILogger', который нужно ввести в' Handler2'? –

ответ

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>.

Смежные вопросы