Это может быть несколько связано с передачей ILogger или ILoggerFactory конструкторам в AspNet Core? Однако речь идет именно о дизайне библиотеки , а не о том, как реальное приложение, использующее эти библиотеки, реализует ведение журнала.
Я пишу библиотеку .net Standard 2.0, которая будет установлена через Nuget, и чтобы люди, использующие эту библиотеку, могли получать некоторую отладочную информацию, я полагаюсь на Microsoft.Extensions.Logging.Abstractions, чтобы разрешить внедрение стандартизированного регистратора.
Однако я вижу несколько интерфейсов, а пример кода в Интернете иногда использует ILoggerFactory
и создает регистратор в ctor класса. Также есть ILoggerProvider
версия Factory, доступная только для чтения, но реализации могут реализовывать или не реализовывать оба интерфейса, поэтому мне пришлось бы выбирать. (Factory кажется более распространенным, чем Provider).
Некоторый код, который я видел, использует неуниверсальный ILogger
интерфейс и может даже совместно использовать один экземпляр одного и того же регистратора, а некоторые берут ILogger<T>
в своем ctor и ожидают, что контейнер DI будет поддерживать открытые общие типы или явную регистрацию каждого ILogger<T>
варианта моей библиотеки использует.
Прямо сейчас я думаю, что ILogger<T>
это правильный подход, и, возможно, оператор, который не принимает этот аргумент и вместо этого просто передает Null Logger. Таким образом, если журналирование не требуется, оно не используется. Однако некоторые контейнеры DI выбирают самый большой ctor и, таким образом, все равно не работают.
Мне любопытно, что я должен делать здесь, чтобы создать наименьшую головную боль для пользователей, при этом обеспечивая при желании надлежащую поддержку ведения журнала.