2016-10-02 55 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 }); 
     }));