es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Configura un proveedor de registro para una colección de servicios diferente.

Esta es una aplicación ASP.NET en .NET 6. Hay una interfaz de asistente donde el usuario ingresa algunos datos y luego, según la entrada, configuro un nuevo contenedor de inyección de dependencias con los servicios necesarios para completar la tarea. Mi problema es que las instancias de ILogger que salen de este segundo contenedor no utilizan el proveedor personalizado ILoggingProvider que configuré.

Program.cs:

var builder = WebApplication.CreateBuilder(args);
builder.Logging.ClearProviders();
builder.Logging.AddDebug();
builder.Logging.AddSignalRLogging();

public static class ILoggingBuilderExtensions
{
    public static ILoggingBuilder AddSignalRLogging(this ILoggingBuilder builder) 
        => builder.AddProvider(new SignalRLoggerProvider(builder.Services))
           .AddFilter("MyNamespace", LogLevel.Information);
}

El SignalRLoggerProvider proviene de https://stackoverflow.com/questions/59725547/how-to-implement-an-ilogger-to-send-messages-to-a-signalr-hub.

Controlador:

IServiceCollection services = new ServiceCollection();
services.AddLogging();
services.AddSignalR();
services.AddSingleton(_sheetsClient); // esto fue inyectado en el controlador
services.AddSingleton(new PostedTeamReaderService(model.Divisions));

string[] divisionNames = model.Divisions.Keys.ToArray();
foreach (string divisionName in divisionNames)
{
    services.AddSingleton(provider => new DivisionSheetService(divisionName,
        provider.GetRequiredService(),
        provider.GetRequiredService(),
        provider.GetRequiredService>(),
        provider.GetRequiredService>) 
    );
}

Sé que mi proveedor funciona porque cuando registro cosas en un controlador cuyas dependencias fueron inyectadas desde la colección de servicios de HostBuilder (_sheetsClient), esos mensajes funcionan correctamente. En las clases que vienen de este otro contenedor (DivisionSheetService), esos mensajes de registro no van a ninguna parte y cuando veo la instancia de ILogger en el depurador, muestra que no tiene un logger al que está escribiendo.

Entonces debe ser el caso de que mi proveedor personalizado de registro es desconocido para el segundo contenedor, pero no puedo entender cómo registrarlo allí.

Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que las instancias de ILogger<> que salen del segundo contenedor no están utilizando el ILoggingProvider personalizado que se configuró. Esto puede deberse al hecho de que el proveedor no ha sido registrado en el segundo contenedor.

    Para registrar el proveedor en el segundo contenedor, se puede agregar a IServiceCollection como un singleton:

    services.AddSingleton<ILoggerProvider>(new SignalRLoggerProvider(services));
    

    Esto debería hacer que el proveedor esté disponible para el segundo contenedor y permitir su uso para la generación de registros.

    Además de esto, puede ser necesario asegurarse de que se esté utilizando la configuración de generación de registros correcta en el segundo contenedor. Esto se puede hacer configurando la generación de registros en el método ConfigureServices de la clase de inicio:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddLogging(builder => {
            builder.ClearProviders();
            builder.AddProvider(new SignalRLoggerProvider(services));
        });
    }
    

    Esto debería asegurar que se utilice la configuración de generación de registros correcta en toda la aplicación, incluido el segundo contenedor.

Comments are closed.