Estoy escribiendo una biblioteca de C# y estoy tratando de averiguar cuál es la mejor manera de iniciar sesión. Quiero que mi biblioteca se pueda usar con y sin DI.
Supongamos que mi biblioteca tiene una clase pública principal llamada Foo que acepta una dependencia de IBar a través de su constructor, pero también tiene un miembro privado integrado de tipo Qux (una clase interna).
Para mantener el marco de registro de mi biblioteca independiente, creo que la mejor práctica es pasar un ILogger<Foo> al constructor de Foo y un ILogger<BarImpl> a una implementación de IBar .
Mi pregunta es, ¿debería Qux usar el ILogger<Foo> , o debería tener su propio registrador, ILogger<Qux> ? Si es así, ¿cómo crearía Foo un ILogger<Qux> para pasar a Qux ?
public interface IBar {} public class BarImpl : IBar { public BarImpl(ILogger<BarImpl> logger) { } } internal class Qux { public Qux(ILogger<Qux> logger) // should Qux accept ILogger<Qux> or ILogger<Foo>? { } } public class Foo { private Qux _qux; public Foo(IBar bar, ILogger<Foo> logger) { // how to create ILogger<Qux> here? // _qux = new Qux(); } }Tienes algunas maneras de hacer esto.
Qux sea un detalle de implementación de Foo tal como es ahora, entonces: public Foo(IBar bar, ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<Foo>(); _qux = new Qux(loggerFactory.CreateLogger<Qux>()); } public Foo(IBar bar, Qux qux, ILogger<Foo> logger) { _logger = logger; _qux = qux; } // inside your library where you can see the internal Qux public static IServiceCollection InjectMyLibraryServices(this IServiceCollection services) { // ... services.AddScoped<IQux, Qux>(); services.AddScoped<IFoo, Foo>(); }Qux y simplemente obtener el registrador (como lo menciona @ canton7): public Foo(IBar bar, ILogger<Foo> logger) { _logger = logger; _qux = new Qux(); } internal class Qux { private readonly ILogger _logger = LogManager.GetLogger(typeof(Qux)); }Nota al margen: este último enfoque representa el antipatrón del localizador de servicios y oculta la dependencia de registro. Úselo solo si comprende los pros y los contras de hacer las cosas de esta manera. Yo personalmente no recomendaría este enfoque.