Cela peut être quelque peu lié à Passer ILogger ou ILoggerFactory aux constructeurs dans AspNet Core? , mais il s'agit spécifiquement de la conception de bibliothèques , pas de la manière dont l'application réelle qui utilise ces bibliothèques implémente sa journalisation.
J'écris une bibliothèque .net Standard 2.0 qui sera installée via Nuget, et pour permettre aux personnes utilisant cette bibliothèque d'obtenir des informations de débogage, je dépends de Microsoft.Extensions.Logging.Abstractions pour permettre l'injection d'un enregistreur standardisé.
Cependant, je vois plusieurs interfaces et des exemples de code sur le Web utilisent ILoggerFactory
et créent parfois un enregistreur dans le ctor de la classe. Il y a aussi ILoggerProvider
qui ressemble à une version en lecture seule de l'usine, mais les implémentations peuvent implémenter ou non les deux interfaces, donc je devrais choisir. (L'usine semble plus courante que le fournisseur).
Certains codes que j'ai vu utilisent l' ILogger
interface non générique et peuvent même partager une instance du même enregistreur, et certains prennent un ILogger<T>
dans leur ctor et s'attendent à ce que le conteneur DI prenne en charge les types génériques ouverts ou l'enregistrement explicite de chaque ILogger<T>
variante de ma bibliothèque les usages.
À l'heure actuelle, je pense que ILogger<T>
c'est la bonne approche, et peut-être un facteur qui ne prend pas cet argument et passe simplement un Null Logger à la place. De cette façon, si aucune journalisation n'est nécessaire, aucune n'est utilisée. Cependant, certains conteneurs DI choisissent le plus gros facteur et échoueraient donc de toute façon.
Je suis curieux de savoir ce que je suis censé faire ici pour créer le moins de maux de tête pour les utilisateurs, tout en permettant une prise en charge appropriée de la journalisation si vous le souhaitez.