Вспомогательное поле типа ILogger, но введенный параметр типа ILogger <T> - PullRequest
0 голосов
/ 04 марта 2019

Инфраструктура ведения журнала .Net Core была разработана для использования с внедрением зависимостей.Например, если вы хотите добавить запись в класс с именем MyClass, вам нужно добавить параметр ILogger<MyClass> в конструктор класса:

private readonly ILogger _logger;

MyClass(ILogger<MyClass> logger)
{
    _logger = logger;
}

Вопрос

Приведенная выше кодировкашаблон очень распространен (IMHO), где поле поддержки типа ILogger в то время как внедренный параметр типа ILogger<T>.

Почему бы нам не использовать поле поддержки типа ILogger<MyClass> вместо ILogger?Есть ли разница?

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Разницы нет.Интерфейс ILogger<T> не добавляет никаких дополнительных методов или свойств к интерфейсу ILogger, поэтому вы можете свободно выбирать, что предпочитаете.

Вы можете просмотреть исходный код каждого из них и код регистрации ниже:

Код ILogger

Код ILoggerOfT

0 голосов
/ 04 марта 2019

ILogger<T> реализует ILogger.Вот почему вы можете назначить ILogger<T> на ILogger Комментарий XML для ILogger<T>:

Обычно используется для активации активации именованного ILogger из внедрения зависимостей.

Это говорит о том, что где-то для некоторого кода нужен тип, чтобы создать для вас регистратор.

Если вы углубитесь в код для service.AddLogging(), к нему добавляются ILoggerFactory и ILogger<>IServiceCollection.ILogger<T> имеет конкретную реализацию Logger<T>.Logger<T> получает вышеупомянутый ILoggerFactory вводимый код и затем вызывает CreateLogger, передавая отображаемое имя типа T. LoggerFactory затем проверяет кэш уже созданных Logger s на основе T и возвращает его из кэшадобавив его, если он не существует.

Таким образом, в принципе, он не добавляет никаких дополнительных функциональных возможностей, но внутренне повышает производительность, сохраняя ILogger для каждого типа в кеше и передавая его вам при необходимости.<T> необходим, потому что он используется при поиске в словаре / кэше

0 голосов
/ 04 марта 2019

ILogger<T> определяется следующим образом:

public interface ILogger<out TCategoryName> : ILogger
{
}

Я нашел этот код через "перейти к определению" в Visual Studio, но вы можете увидеть то же самое в теперь архивированном репозитории здесь.

Исходя из этого, я пришел к выводу, что ILogger<T> предоставляет простой способ установить категорию сгенерированного регистратора, но фактически не меняет функциональность.Таким образом, я думаю, что использование ILogger в качестве вспомогательного поля хорошо, поскольку ILogger<T> не добавляет никаких методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...