Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

132
Vistas
¿Debería el miembro de la clase privada usar su propia instancia de ILogger?

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(); } }
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Tienes algunas maneras de hacer esto.

  1. Si desea que 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>()); }
  1. Si desea usar DI más correctamente y puede depender de que los usuarios usen correctamente su biblioteca (como lo sugiere @Llama):
 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>(); }
  1. Puede deshacerse de DI para 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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda