Использование NLog во время внедрения зависимостей - PullRequest
1 голос
/ 05 мая 2020

У меня есть примерно такой класс:

public class ABCHelper : ABCBase, IABCHelper
{
    public ABCHelper()
        : base(LogManager.GetCurrentClassLogger())
    {
    }
}


public class ABCBase : IABCBase
{
        protected readonly Logger logger;

        protected ABCBase(Logger logger)
        {
            this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }
        public async Task<HttpResponseMessage> MakeAsyncCall(HttpRequestMessage request)
        {
            // some code
            this.logger.Info("some string");
        }
}   

Регистрация класса в Unity:

container.RegisterType<IABCHelper, ABCHelper>();

Когда я вызываю MakeAsyncCall в некотором потоке кода, NLog регистрирует имя класса как " DynamicBuildPlanGenerationContext".

Я ожидал «ABCHelper» вместо «DynamicBuildPlanGenerationContext».

Что мне не хватает?

1 Ответ

0 голосов
/ 05 мая 2020

Прежде всего, это немного спорно, если ABCHelper ваш текущий класс, так как он еще не построен;)

1002 * Я думаю, что Unity использует некоторые приемы для эффективного построения зависимостей. Описание DynamicBuildPlanGenerationContext

Этот объект отслеживает текущее состояние генерации плана сборки, накапливает промежуточный язык Microsoft, предоставляет преамбулу и постамбулу для динамического c метод и отслеживает такие вещи, как локальные переменные в сгенерированном MSIL, чтобы их можно было повторно использовать в стратегиях генерации MSIL.

NLog пытается найти имя текущего класса, проверяя стек вызовов, но не может найти его, вероятно, из-за оптимизации.

Я думаю, что самое простое решение - использовать именованные регистраторы , например, используя LogManager.GetLogger(string)

public class ABCHelper : ABCBase, IABCHelper
{
    public ABCHelper()
        : base(LogManager.GetLogger(nameof(ABCHelper)))
    {
    }
}

Боковое примечание, возможно, это из-за демонстрации, но я не вижу здесь правильно введенного регистратора. Если вы не хотите использовать DI для регистраторов, вы можете просто создать поле stati c?

Если вам нравится использовать внедренные логгеры, я бы рекомендовал проверить Microsoft.Extensions.Logging с NLog.Extensions.Logging , который также работает с Unity и . NET Каркас. Это также может быть полезно: Разрешить generi c Microsoft.Extensions.Logging.ILogger с Unity - получить InvalidCastException

Или вы можете использовать

...