2016-10-02 4 views
2

asp.net mvc에 익숙해지기 위해 노력 중이며 현재 로깅을 설정하고 있습니다.일반 팩토리 메서드에 대한 유니티 유형 등록

나는 Microsoft.Extensions.Logging을보고 설정하는 방법에 대해 읽었지만 형식 등록과 함께 고심하고 있습니다.

나는 설정에 내가

private static void RegisterLoggingTypes(IUnityContainer container) 
    { 
     ILoggerFactory loggerFactory = new LoggerFactory() 
      .AddConsole() 
      .AddDebug(); 
     container.RegisterType<ILogger<HomeController>>(new InjectionFactory(c => loggerFactory.CreateLogger<HomeController>())); 
    } 

으로 그렇게 할 수 있습니다

public HomeController(ILogger<HomeController> logger) 

의 형태를하고 싶습니다 그러나 나는 모든 종류의 하나를 선언하고 싶지 않아요. 나는

container.RegisterType(typeof(ILogger<>), new InjectionFactory((c,t,s) => loggerFactory.CreateLogger(t))); 

을 시도하지만 내가이 작업을 수행 할 수 있습니다 어떻게 ILogger(of HomeController)

어떤 생각 대신 ILogger을 반환?

감사합니다.

+0

나는 이미 당신 자신이 대답을 발견했다. 그러나 빌드 추적으로 대신이 작업을 수행 할 수 있어야합니다. 이 예제는 Log4Net 용이지만 이론은 거의 같습니다. http://blog.baltrinic.com/software-development/dotnet/log4net-integration-with-unity-ioc-container – smoksnes

답변

3

나는 이것을 알아 냈습니다. 리플렉션을 사용하여 일반 메서드를 생성 한 다음이를 호출해야했습니다.

 var factoryMethod = typeof(LoggerFactoryExtensions). 
          GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public). 
          First(x => x.ContainsGenericParameters); 

     container.RegisterType(typeof(ILogger<>), new InjectionFactory((c, t, s) => 
     { 
      var genFactoryMethod = factoryMethod.MakeGenericMethod(t.GetGenericArguments()[0]); 
      return genFactoryMethod.Invoke(null, new object[] { loggerFactory }); 
     }));