2016-07-21 1 views
0

나는 두 개의 인터페이스 ILoggerILogger<T>을 가지고 있습니다. 후자는 이전의 것을 상속합니다.일반 객체를 비 제네릭 매개 변수로 사용하는 Autofac

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

를 내가 해결하고 ILogger<T> 대신의 ILogger에 전달하는 Autofac에게 싶습니다 그리고 어떤 클래스 Handler 좋아. ILoggerILogger<T>의 인스턴스를 모두 해결할 수 있다고 가정합니다. 여기서는 문제가되지 않습니다.

은 내가 수행하여 인스턴스를 전달할 수 알고

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

3 오버로드하지만 그들 중 3 (적어도 내 Autofac의 버전에) 어떻게 든 매개 변수로 인스턴스를 사용하여이 의미한다. 이 작업을 수행하는 몇 가지 방법이 있나요 .WithParameter(typeOf(ILogger<Handler>))

:

내가 좋아하는 뭔가를 원하십니까?

+0

런타임시 어떻게 작동합니까? 당신은 확실히 이렇게 컴파일 할 수있는 것을 쓸 수 없었습니다. 왜 런타임이 다르게 동작 할 것이라고 기대합니까? –

+0

'Handler' 인스턴스를 수동으로 생성한다면'var handler = new Handler (new DefaultLogger ()); '를 쓸 수 있습니다. 내가 Handler를 요청할 때마다 Autofac이 나를 위해 그것을 할 수있는 방법이 있다고 생각했습니다. – Luiso

+0

'ILogger'를'DefaultLogger ()'에 매핑하는 것이 어떨까요? 아니면'Handler2'에 주입 될 필요가있는'ILogger'에 대해'DefaultLogger ()'이 될까요? –

답변

1

등록 이벤트를 사용하여 수행 할 수 있습니다. LoggerFactory.GetLoggerForClass()은 본질적으로 ILogger<T>의 인스턴스를 생성

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

.