web-dev-qa-db-fra.com

Accès à l'objet IOptions <T> .NET Core

Je suis nouveau sur .NET Core et je vous prie donc de m'excuser s'il s'agit d'une question pour débutant. J'ai créé un projet d'API Web dans .NET Core 2 à l'aide de VS 2017.

Pour moi, j'ai un fichier appsettings.json Avec certains paramètres de connexion.

Après avoir lu IOptions<T> Dans les didacticiels Microsoft, je fais quelque chose comme ceci:

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    services.Configure<MyOptions>(Configuration);

    // I want to access MyOptions object here to configure other services?how do i do that?

    service.AddHangfire( // Get MyOptions.HangfireConenctionString etc.)
}

Comment accéder à l'objet MYOptions créé dans ConfigureServices et aussi si je dois y accéder dans la méthode Configure(IApplicationBuilder app,..)?

Je n'ai vu que des exemples d'injection IOptions<T> Dans les contrôleurs dans les tutoriels.

11
Coder

Pour utiliser certains paramètres dans

public void ConfigureServices(IServiceCollection services)
{
    // Load the settings directly at startup.
    var settings = Configuration.GetSection("Root:MySettings").Get<MySettings>();

    // Verify mailSettings here (if required)

    service.AddHangfire(
        // use settings variable here
    );

    // If the settings needs to be injected, do this:
    container.AddSingleton(settings);
}

Si vous souhaitez que votre objet de configuration soit utilisé dans un composant d'application , n'injectez pas un IOptions<T> dans votre composant, car cela ne cause que des inconvénients imprévus, comme expliqué ici . Au lieu de cela, injectez la valeur directement, comme indiqué dans l'exemple suivant.

public class HomeController : Controller  
{
    private MySettings _settings;
    public HomeController(MySettings settings)
    {
        _settings = settings;
    }
}
14
Steven

Tu es proche

services.Configure<MyOptions>(options => Configuration.GetSection("MyOptions").Bind(options));

Vous pouvez désormais accéder à vos MyOptions à l'aide de l'injection de dépendance

public class HomeController : Controller  
{
    private MySettings _settings;
    public HomeController(IOptions<MySettings> settings)
    {
        _settings = settings.Value
        // _settings.StringSetting == "My Value";
    }
}

J'ai pris les extraits de cet excellent article: https://andrewlock.net/how-to-use-the-ioptions-pattern-for-configuration-in-asp-net-core-rc2/ par Andrew Lock.

5
Frank Nielsen

Cela dépend de votre appsettings.json Et de la façon dont vous nommez la section. Par exemple:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "MySettings": {
    "ConnectionString": "post.gres:39484"
  }
}

Ici, le nom de la section est MySettings . Normalement, dans ASP.NET Core 2.2 dans mon Startup.cs, J'utilise quelque chose comme:

services.AddOptions();
services.Configure<MyOptions>(Configuration.GetSection("MySettings"));

Mais quelque chose comme ça fonctionne aussi:

services.AddOptions();
services.AddOptions<MyOptions>().Bind(Configuration.GetSection("MySettings"));

Si vous avez configuré votre programme pour utiliser AddEnvironmentVariables(), les paramètres peuvent également être définis en ajoutant une variable de configuration nommée MySettings__ConnectionString. La valeur peut provenir de plusieurs endroits .

Si vous souhaitez valider votre classe d'options, vous pouvez utiliser des annotations de données .

0
Kees C. Bakker