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.

Pregunta sobre el patrón de opciones y la inyección de dependencias.

Tengo el siguiente código en el código de inicio de un proyecto:

“`c#
public void ConfigureServices(IServiceCollection services)
{

services
.AddAppCommonServices(configuration)
.AddSingleton<IKeyVaultClient, KeyVaultClient&gt();

<pre><code>IKeyVaultClient keyVaultClient = services.BuildServiceProvider().GetService<IKeyVaultClient>();

services.RegisterMonitoringTelemetry(keyVaultClient.GetSecretAsync(configuration[Consts.AppInsightsInstrumentationKey]).Result);


</code></pre>

Este código funciona bien. Sin embargo, desde que actualizamos recientemente la versión de .NET Core, hemos estado recibiendo un <a href="https://learn.microsoft.com/en-us/aspnet/core/diagnostics/asp0000?view=aspnetcore-6.0">mensaje de advertencia debido a la llamada al método BuildServiceProvider()</a>. Estaba buscando la forma correcta de escribir el código anterior para evitar el problema descrito por la advertencia y entiendo que la forma correcta es utilizar el Patrón de opciones para inyectar los valores necesarios. Sin embargo, aunque entiendo el concepto, todavía estoy confundido sobre cómo usarlo en mi caso.

He intentado esto:

“`c#
public void ConfigureServices(IServiceCollection services)
{

services.AddOptions<KeyVaultClientSettings>()
    .Configure<IKeyVaultClient>((settings, kvc) =>
    {
        settings.Secret = kvc.GetSecretAsync(configuration[Consts.AppInsightsInstrumentationKey]).Result;
    }
);

services
    .AddAppCommonServices(configuration)
    .AddSingleton<IKeyVaultClient, KeyVaultClient>();

services
    .Configure<KeyVaultClientSettings>(settings =>
    {
        services.RegisterMonitoringTelemetry(settings.Secret);
    });

...

“`

Pero no funciona. Depurando, parece que el método RegisterMonitoringTelemetry nunca se llama, aunque no estoy seguro de por qué.

¡Agradecería mucho cualquier ayuda para corregir mi código!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código anterior es que el método Configure se utiliza para registrar servicios en el contenedor, pero en realidad no ejecuta ningún código. En su lugar, simplemente registra la función de configuración para que se ejecute cuando el servicio se resuelva desde el contenedor.

    Para solucionar esto, puedes crear una clase separada para guardar la configuración de KeyVaultClientSettings e inyectarla en el método ConfigureServices. Aquí tienes un ejemplo:

    “`c#
    public class KeyVaultClientSettings
    {
    public string Secret { get; set; }
    }

    public void ConfigureServices(IServiceCollection services)
    {

    services.AddOptions<keyvaultclientsettings>()
        .Configure<ikeyvaultclient>((settings, kvc) =>
        {
            settings.Secret = kvc.GetSecretAsync(configuration[Consts.AppInsightsInstrumentationKey]).Result;
        }
    );
    
    services
        .AddAppCommonServices(configuration)
        .AddSingleton<ikeyvaultclient, keyvaultclient="">();
    
    services.Configure<keyvaultclientsettings>(configuration.GetSection(Consts.KeyVaultSettingsSection));
    
    services.RegisterMonitoringTelemetry(Configuration.GetValue<string>($"{Consts.KeyVaultSettingsSection}:Secret"));
    
    ...
    

    }
    “`

    En este código actualizado, definimos una nueva clase KeyVaultClientSettings que tiene una propiedad Secret. Luego, utilizamos AddOptions para registrarla en el contenedor y Configure para establecer la propiedad Secret basada en IKeyVaultClient.

    A continuación, configuramos las opciones de KeyVaultClientSettings utilizando Configure y el objeto Configuration, que debería cargar la configuración desde appsettings.json.

    Por último, llamamos a RegisterMonitoringTelemetry con el valor de Secret de las opciones de KeyVaultClientSettings, obtenido utilizando Configuration.GetValue. Esto inyectará el valor en el método como se espera.</ikeyvaultclient,>

Comments are closed.