2016-10-02 3 views
2

Я пытаюсь познакомиться с 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)

Любая идея, как я могу это сделать?

Thanks

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