Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

141
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!