Веб-API - внедрение зависимости в ServiceContainer с использованием Unity - PullRequest
0 голосов
/ 08 октября 2018

Я использую ExceptionLogger для обработки всех глобальных исключений.Мой наследующий класс требует внедрения зависимостей для вызова Nlog.

public class NLogExceptionLogger : ExceptionLogger
{
    private readonly ILoggingService _loggingService;

    public NLogExceptionLogger(ILoggingService<NLogExceptionLogger> loggingService)
    {
        _loggingService = loggingService;
    }

    public override void Log(ExceptionLoggerContext context)
    {
        _loggingService.FirstLevelServiceLog(context.Exception.StackTrace);
    }
}

LoggingService Class:

public class LoggingService<T> : ILoggingService<T>
{
    private readonly ILogger _logger;

    public LoggingService()
    {
        string currentClassName = typeof(T).Name;
        _logger = LogManager.GetLogger(currentClassName);
    }

    public void FirstLevelServiceLog(string log)
    {
        _logger.Log(LogLevel.Debug, log);
    }
}

Мой код Unity:

public static UnityContainer RegisterComponents()
{
    var container = new UnityContainer();
    container.RegisterType(typeof(ILoggingService<>), typeof(LoggingService<>))
}

Iя регистрирую ExceptionLogger глобально, выполнив: (В этой строке я получаю сообщение об ошибке)

config.Services.Add(typeof(IExceptionLogger), typeof(NLogExceptionLogger));
//Register Dependency Container
config.DependencyResolver = new UnityDependencyResolver(UnityConfig.RegisterComponents());

Я получаю следующую ошибку во время выполнения:

Система.ArgumentException: 'Тип RuntimeType должен быть производным от IExceptionLogger.'

Я предполагаю, что я неправильно регистрирую зависимость для NLogExceptionLogger.

Любая идея о том, какразрешить зависимость при регистрации сервиса?

1 Ответ

0 голосов
/ 08 октября 2018

При добавлении службы к ServicesContainer вы добавляете тип с экземпляром службы.

Предполагая, что преобразователь зависимостей уже настроен, его можно использовать для разрешения экземпляра, если у него есть зависимости.

var logger = config.DependencyResolver.GetService(typeof(NLogExceptionLogger));
config.Services.Add(typeof(IExceptionLogger), logger);

Существует также разница между регистраторами исключений и обработчиками исключений.

Я предлагаю просмотреть следующую ссылочную ссылку, чтобы определить, какая из них подходит для ваших нужд.

Ссылка Обработка глобальных ошибок в ASP.NET Web API 2

...