Ini mungkin agak terkait dengan Pass ILogger atau ILoggerFactory ke konstruktor di AspNet Core? , namun ini secara khusus tentang Desain Perpustakaan , bukan tentang bagaimana aplikasi sebenarnya yang menggunakan perpustakaan tersebut mengimplementasikan pencatatannya.
Saya sedang menulis Pustaka .net Standard 2.0 yang akan diinstal melalui Nuget, dan untuk memungkinkan orang yang menggunakan Pustaka itu mendapatkan beberapa info debug, saya bergantung pada Microsoft.Extensions.Logging.Abstractions untuk memungkinkan Logger standar dimasukkan.
Namun, saya melihat banyak antarmuka, dan kode contoh di web terkadang menggunakan ILoggerFactory
dan membuat logger di ctor kelas. Ada juga ILoggerProvider
yang terlihat seperti versi hanya-baca dari Pabrik, tetapi implementasi mungkin atau mungkin tidak mengimplementasikan kedua antarmuka, jadi saya harus memilih. (Pabrik tampaknya lebih umum daripada Penyedia).
Beberapa kode yang saya lihat menggunakan ILogger
antarmuka non-generik dan bahkan mungkin berbagi satu contoh dari logger yang sama, dan beberapa mengambil ILogger<T>
di ctor mereka dan mengharapkan wadah DI untuk mendukung jenis generik terbuka atau pendaftaran eksplisit dari setiap ILogger<T>
variasi perpustakaan saya penggunaan.
Saat ini, saya pikir itu ILogger<T>
adalah pendekatan yang tepat, dan mungkin ctor yang tidak mengambil argumen itu dan hanya melewati Null Logger sebagai gantinya. Dengan begitu, jika tidak diperlukan logging, tidak ada yang digunakan. Namun, beberapa kontainer DI memilih ctor terbesar dan dengan demikian akan tetap gagal.
Saya ingin tahu tentang apa yang seharusnya saya lakukan di sini untuk mengurangi sakit kepala bagi pengguna, sambil tetap mengizinkan dukungan logging yang tepat jika diinginkan.