web-dev-qa-db-fra.com

Accès de la bibliothèque de classes à appsetting.json dans Asp.net-core

J'essaie d'accéder au fichier appsetting.json à partir d'une bibliothèque de classes. Jusqu'à présent, la solution que j'ai trouvée consiste à créer une classe de configuration implémentant l'interface IConfiguration à partir de Microsoft.Extensions.Configuration et à ajouter le fichier json à la classe et à lire le même.

var configuration = new Configuration();
configuration.AddJsonFile("appsetting.json");
var connectionString= configuration.Get("connectionString");

Cela semble être une mauvaise option car nous devons ajouter le fichier json chaque fois que nous devons accéder à la configuration de la définition de l'application. Ne nous avons aucune alternative comme ConfigurationManager dans ASP.NET .

22
Parameswar Rao

Je suppose que vous voulez accéder au fichier appsettings.json à partir de l'application Web car les bibliothèques de classes n'ont pas de appsettings.json par défaut.

Je crée une classe de modèle dont les propriétés correspondent aux paramètres définis dans une section de appsettings.json.

Section dans appsettings.json

"ApplicationSettings": {
    "SmtpHost": "mydomain.smtp.com",
    "EmailRecipients": "[email protected];[email protected]"
}   

Classe de modèle correspondante

namespace MyApp.Models
{
    public class AppSettingsModel
    {
        public string SmtpHost { get; set; }
        public string EmailRecipients { get; set; }
    }
}

Renseignez ensuite cette classe de modèle et ajoutez-la à la collection IOptions dans le conteneur DI (cette opération est effectuée dans la méthode Configure() de la classe Startup).

services.Configure<AppSettingsModel>(Configuration.GetSection("ApplicationSettings"));

// Other configuration stuff

services.AddOptions();

Vous pouvez ensuite accéder à cette classe à partir de n'importe quelle méthode appelée par la structure en l'ajoutant en tant que paramètre dans le constructeur. Le framework gère la recherche et la fourniture de la classe au constructeur.

public class MyController: Controller
{
    private IOptions<AppSettingsModel> settings;

    public MyController(IOptions<AppSettingsModel> settings)
    {
        this.settings = settings;
    }
}

Ensuite, lorsqu'une méthode d'une bibliothèque de classes a besoin des paramètres, je passe les paramètres individuellement ou l'objet complet.

22
Clint B

Je sais qu'une réponse a déjà été acceptée, mais cette question est l'une des principales réussites de Google et celle des opérateurs concerne les bibliothèques de classes et non une application Web ASP.NET ou WebApi.

OMI, les bibliothèques de classes ne doivent pas utiliser les paramètres de l'application et doivent être agnostiques à ces paramètres. Si vous avez besoin de paramètres d'application dans votre bibliothèque de classes, vous devez alors fournir ces paramètres à partir de votre consommateur. Vous pouvez voir un exemple de ceci Sur cette SO Question

30
Stephen Porter

Je sais que la question a une réponse acceptée mais la question concerne les bibliothèques de classes et la façon de lire appsettings.json à partir d'une bibliothèque de classes est la suivante: 

Créez un modèle dont les propriétés correspondent à celles de votre fichier de paramètres:

public class ConfigurationManager
{
    public string BaseUrl { get; set; }
}

Ajoutez les paramètres actuels dans votre appsettings.json

  "ConfigurationManager": {
    "BaseUrl": "myValue"
  }

Enregistrez maintenant la section appsettings.json avec votre modèle dans startup.cs:

 services.Configure<ConfigurationManager>(Configuration.GetSection("ConfigurationManager"));

Dans votre bibliothèque de classes, créez une classe qui utilise 

using Microsoft.Extensions.Options;

Et obtenez vos paramètres de configuration:

using Microsoft.Extensions.Options;


public class KeyUrls: IKeyUrls
{
    public string BaseUrl = "";
    private readonly IOptions<ConfigurationManager> _configurationService;

    public KeyUrls(IOptions<ConfigurationManager> configurationservice)
    {
        _configurationService = configurationservice;
        BaseUrl = _configurationService.Value.BaseUrl;
    }

    public  string GetAllKeyTypes()
    {
        return $"{BaseUrl}/something";
    }

    public  string GetFilteredKeys()
    {
        return $"{BaseUrl}/something2";
    }
}

Pour plus de détails, consultez This

5
ThunD3eR

Ajouter Référence de System.Configuration dans le projet auquel vous avez ajouté la classe, puis vous permettant d'utiliser toutes les clés .Cela a fonctionné pour moi. Bonne chance :)

0
sami ullah