我正在尝试熟悉asp.net mvc,目前我正在设置日志记录。
我已经看过Microsoft.Extensions.Logging并阅读了如何设置它,但我正在努力解决统一类型注册问题。
我想设置
的类型public HomeController(ILogger<HomeController> logger)
我可以用
这样做 private static void RegisterLoggingTypes(IUnityContainer container)
{
ILoggerFactory loggerFactory = new LoggerFactory()
.AddConsole()
.AddDebug();
container.RegisterType<ILogger<HomeController>>(new InjectionFactory(c => loggerFactory.CreateLogger<HomeController>()));
}
但我不想为每种类型声明一个。我试过了
container.RegisterType(typeof(ILogger<>), new InjectionFactory((c,t,s) => loggerFactory.CreateLogger(t)));
但这会返回ILogger
而不是ILogger(of HomeController)
知道我该怎么做吗?
由于
答案 0 :(得分:5)
我已经弄明白了。我需要使用反射生成泛型方法然后调用它。
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 });
}));