web-dev-qa-db-fra.com

Paramètres d'application d'objet complexe dans Azure Function

J'ai ces entrées dans mon local.settings.json

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "whateverstorageaccountconnectionstring",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet"
    },
    "BusinessUnitMapping": {
        "Values": {
            "Connections": "CON",
            "Products": "PRD",
            "Credit & Affordability": "CAA",
            "Accounts Receivable": "ARC",
            "Identity":  "IDT"
        }
    }
}

J'ai ce code pour lire les valeurs au démarrage

services.Configure<BusinessUnitMapping>(options => configuration.GetSection("BusinessUnitMapping").Bind(options));

où se trouve BusinessUnitMapping

public class BusinessUnitMapping
{
  public Dictionary<string, string> Values { get; set; }
  public BusinessUnitMapping()
  {
      Values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
  }
}

lorsque j'exécute l'application de fonction localement, il peut lire ces paramètres dans BusinessUnitMapping sans aucun problème.

L'édition avancée des paramètres d'application dans le portail Azure autorise uniquement une paire clé-valeur simple comme ci-dessous

[
  {
    "name": "AzureWebJobsDashboard",
    "value": "DefaultEndpointsProtocol=Somevalue",
    "slotSetting": false
  },
  {
    "name": "AzureWebJobsStorage",
    "value": "DefaultEndpointsProtocol=Somevalue",
    "slotSetting": false
  },
  ...
]

Questions

  1. Est-ce une approche correcte pour stocker les paramètres d'application complexes dans Azure Function?
  2. Comment configurer BusinessUnitMapping dans Azure Portal pour l'application de fonction que j'ai déployée?

-Alan-

8
Alan B
  1. Est-ce une approche correcte pour stocker les paramètres d'application complexes dans Azure Function?

Ceci est encore une question ouverte: voir ce problème github demandant exactement cela

  1. Comment configurer BusinessUnitMapping dans Azure Portal pour l'application de fonction que j'ai déployée?

Mon approche préférée actuelle consiste à utiliser le modèle d'options avec un délégué qui utilise GetEnvironmentVariable qui fonctionnera à la fois localement et dans Azure. L'inconvénient est que vous ne pouvez pas créer de types complexes dans le fichier de paramètres local lui-même, mais votre objet peut être aussi complexe que vous le souhaitez.

Un exemple simple:

Dans local.settings.json:

{
  ...
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    ...
    "SomeSection:Setting1": "abc",
    "SomeSection:Setting2": "xyz",
  },
  ...
}

Dans votre startup:

services.Configure<MySettingsPoco>(o =>
{
    o.Setting1 = Environment.GetEnvironmentVariable("SomeSection:Setting1");
    o.Setting2 = Environment.GetEnvironmentVariable("SomeSection:Setting2");
});

Ensuite, dans Azure, vous pouvez créer ces paramètres comme suit:

enter image description here

4
Matt