2016-10-02 60 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)

任何想法的我該怎麼辦呢?

謝謝

+0

我看到你已經找到了自己的答案。但是你應該可以用buildtracking來做到這一點。這個例子適用於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 }); 
     }));