Я работаю над приложением ASP.NET MVC.
Я инициализировал свой LoggerFactory в статическом классе, который вызывается из Global.asax.
using Microsoft.Extensions.Logging;
using Serilog;
using System.IO;
namespace web
{
public static class LogConfig
{
public static LoggerFactory LoggerFactory = new LoggerFactory();
public static void RegisterLogger()
{
LoggerFactory = new LoggerFactory();
Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.RollingFile(Path.Combine("", "log-{Date}.txt")).CreateLogger();
LoggerFactory.AddSerilog();
}
}
}
теперь я хочу использовать ninject, чтобы внедрить экземпляр ILogger в мой конструктор...
В моем конструкторе у меня есть:
private ILogger<MyTypeController> _logger;
public MyTypeController(ILogger<MyTypeController>)
{
// This works fine but I want to inject it
_logger = LogConfig.LoggerFactory.CreateLogger<MyTypeController>();
}
Приведенный выше код работает, но я хочу внедрить его с помощью ninject... это то, что я пробовал, но даже не компилируется:
kernel.Bind(typeof(ILogger<>)).ToProvider(LogConfig.LoggerFactory.CreateLogger<>());
CreateLogger<T>
, в аргумент конструктора неуниверсального интерфейсаILogger
вместоILogger<T>
. ВнедрениеILogger<T>
— это просто шум для потребителя, который может привести к случайным ошибкам, когда указан неверныйT
, и усложняет тестирование. - person Steven   schedule 20.10.2017ILoggerFactory
иILogger<T>
— ужасная идея, и, как мне кажется, единственная причина, по которой Microsoft делает это (и публично продвигает это), заключается в том, что в их встроенном контейнере отсутствует возможность сопоставления неуниверсального интерфейса с универсальной реализацией. Другими словами, они продвигают плохие методы из-за отсутствия реализации. - person Steven   schedule 20.10.2017