Questo può essere in qualche modo correlato a Pass ILogger o ILoggerFactory ai costruttori in AspNet Core? , tuttavia si tratta specificamente di Library Design , non di come l'applicazione effettiva che utilizza quelle librerie implementa la sua registrazione.
Sto scrivendo una libreria .net Standard 2.0 che verrà installata tramite Nuget e per consentire alle persone che la utilizzano di ottenere alcune informazioni di debug, dipendo da Microsoft.Extensions.Logging.Abstractions per consentire l'iniezione di un Logger standardizzato.
Tuttavia, vedo più interfacce e il codice di esempio sul Web a volte utilizza ILoggerFactory
e crea un logger nel ctor della classe. C'è anche ILoggerProvider
che sembra una versione di sola lettura di Factory, ma le implementazioni possono o meno implementare entrambe le interfacce, quindi dovrei scegliere. (Factory sembra più comune di Provider).
Alcuni codici che ho visto utilizzano l' ILogger
interfaccia non generica e potrebbero persino condividere un'istanza dello stesso logger, e alcuni prendono un ILogger<T>
ctor e si aspettano che il contenitore DI supporti i tipi generici aperti o la registrazione esplicita di ogni ILogger<T>
variazione della mia libreria usi.
In questo momento, penso che ILogger<T>
sia l'approccio giusto, e forse un ctor che non accetta quell'argomento e passa invece un Null Logger. In questo modo, se non è necessaria alcuna registrazione, non viene utilizzata. Tuttavia, alcuni contenitori DI scelgono il ctor più grande e quindi fallirebbero comunque.
Sono curioso di sapere cosa dovrei fare qui per creare la minima quantità di mal di testa per gli utenti, pur consentendo il supporto appropriato per la registrazione, se lo si desidera.