Je migre un projet ASP.NET 5 RC1 vers ASP.NET Core et je suis tombé sur un problème intéressant que je n'ai pas encore vu, ou sur lequel j'ai trouvé une solution.
Afin d’utiliser les paramètres de configuration dans le démarrage, j’ai déjà retransmis la configuration de la manière suivante
// Works fine for DI both in ASP.NET 5 RC1 and ASP.NET Core
services.Configure<SomeConfigurationClass>(Configuration.GetSection("SomeConfigurationSection"));
// How I previous retrieved the configuration for use in startup.
// No longer available in ASP.NET Core
var someConfigurationToUseLater = Configuration.Get<SomeConfigurationClass>("SomeConfigurationSection");
Après la mise à jour vers ASP.NET Core 1.0, il semble que Configuration.Get <T> () ne soit plus disponible.
J'ai essayé de mettre à jour le code pour utiliser Configuration.GetValue <T> (), mais cela ne semble pas fonctionner avec les objets et ne fonctionnera que si un chemin d'accès à une valeur est fourni. Cela m'a laissé une solution de contournement pour la plupart de mes classes de configuration comme si
var someConfigurationName = "someConfiguration";
var someConfigurationClass = new SomeConfigurationClass()
{
Value1 = Configuration.GetValue<string>($"{someConfigurationName}:value1"),
Foo = Configuration.GetValue<string>($"{someConfigurationName}:foo"),
Bar = Configuration.GetValue<string>($"{someConfigurationName}:bar")
};
Cependant, cela pose un problème lorsque la classe de configuration contient un tableau d'objets. Dans mon cas, un tableau d'objets client
public class ClientConfiguration
{
public Client[] Clients { get; set; }
}
Avec la configuration suivante
"configuredClients": {
"clients": [
{
"clientName": "Client1",
"clientId": "Client1"
},
{
"clientName": "Client2",
"clientId": "Client2"
}
]
}
Là où cela relierait auparavant la propriété Clients de ma classe de configuration, aucun problème, je ne trouve plus moyen de le faire dans ASP.NET Core 1.0
Réponse mise à jour
Pour ASP Core 1.1.0, la liaison de modèle générique est maintenant effectuée à l'aide de Get
:
var config = Configuration.GetSection("configuredClients").Get<ClientConfiguration>();
Réponse originale
Que dis-tu de ça:
var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>();
En général, vous ne lisez pas la configuration manuellement dans ASP.NET Core, vous créez plutôt un objet qui correspond à votre définition. Vous pouvez en lire plus à ce sujet dans la documentation officielle ici .
Par exemple.
public class MyOptions
{
public string Option1 { get; set; }
public int Option2 { get; set; }
}
public void ConfigureServices(IServiceCollection services)
{
// Setup options with DI
services.AddOptions();
services.Configure<MyOptions>(Configuration);
}
Ensuite, vous n'injectez que les options IOptions<MyOptions>
où vous en avez besoin.
Avec ASP.NET Core 2.0 (essentiellement Core 1.1+), la variable IConfiguration
est injectée dans Startup
et peut être utilisée dans les méthodes ConfigureServices()
et Configure()
.
Comme indiqué dans la réponse acceptée, la configuration peut être liée à un objet. Mais si une seule valeur est requise, l’approche par clé fonctionne bien.
La IConfiguration
fonctionne toujours avec les deux-points :
séparés par des clés de chaîne. Et pour array
, utilisez un index basé sur 0. Ou utilisez la méthode générique getValue<T>()
avec les mêmes clés. Voir exemple ci-dessous:
var clientId2 = Configuration["configuredClients:clients:1:clientId"]?.ToString();
var clientName1 = Configuration.GetValue<string>("configuredClients:clients:0:clientName");
Pour utiliser les mêmes valeurs de configuration dans d'autres classes (par exemple, des contrôleurs)
IConfiguration
et utilisez la même approche à base de clé que ci-dessus. OuExemple de code ci-dessous:
//In Startup.ConfigureServices()
var clientConfig = Configuration.GetSection("configuredClients")
.Get<ClientConfiguration>();
services.AddSingleton(clientConfig);
//Controller
public class TestController : Controller
{
IConfiguration _configStore;
ClientConfiguration _clientConfiguration;
public TestController(IConfiguration configuration,
ClientConfiguration clientConfiguration)
{
_configStore = configuration;
_clientConfiguration = clientConfiguration;
}
public IActionResult Get()
{
//with IConfiguration
var clientId1 = _configStore
.GetValue<string>("configuredClients:clients:0:clientId");
//with strongly typed ClientConfiguration
var clientName1 = _clientConfiguration.Clients[0]?.ClientName;
return new OkObjectResult("Configuration test");
}
}
Plus d'exemples ici .
Si vous voulez obtenir le premier "clientName" (attendu "Client1"), écrivez simplement:
Configuration.GetSection("configuredClients")["clients:0:clientName"];
Mise à jour pour commentaires
Installez .NET Core 1.0.1 et suivez les instructions de @ TomMakin.