web-dev-qa-db-fra.com

Lire à partir de App.config dans un projet de bibliothèque de classes

Je développe un projet simple class library , qui me donnera une dll.

Je voulais qu'une valeur particulière soit lue à partir d'un fichier de configuration. J'ai donc ajouté un fichier App.config à mon projet.

 <?xml version="1.0" encoding="utf-8" ?>
 <configuration>

  <appSettings>
  <add key="serviceUrl" value="test value" />
  </appSettings>

  </configuration>

Ci-dessus, mon fichier App.config, et maintenant je tente de le lire comme suit:

  string strVal = System.Configuration.ConfigurationManager.AppSettings["serviceUrl"];

Mais je ne reçois aucune valeur dans ma variable chaîne.

enter image description here

Je l'avais fait pour une application Web d'une manière similaire et cela a fonctionné. Mais d’une manière ou d’une autre, je ne parviens pas à faire fonctionner cela.

Est-ce que l'idée d'avoir App.config dans un projet de bibliothèque de classes est correcte en premier lieu?

15
Yasser

Comme indiqué dans mon commentaire, ajoutez le fichier App.Config à la solution principale et non au projet de bibliothèque de classes. 

18
Darren

Vous n'avez pas besoin d'ajouter le fichier app.config . Si vous créez une bibliothèque de classes pour une application Web, vous pouvez récupérer la connexion String directement à partir du fichier web.config

OR

Vous pouvez ajouter n’importe quel fichier texte contenant une chaîne de connexion et récupérer cette chaîne .

public static ConnectionStringSettings ConnSettings
{
    get
    {
        string connectionStringKey = null;
        connectionStringKey = ConfigurationManager.AppSettings.Get("DefaultConnectionString");
        return ConfigurationManager.ConnectionStrings[connectionStringKey];          
    }
}
6
Vijay Channe

Accédez à App.Config à partir du projet Executeable in Class Library.

Projet 1: exemple (projet exécutable .exe)

Projet 2: Sample.Database (bibliothèque de classes project .dll)

Le projet 1 contient le fichier app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  <connectionStrings>
    <clear />
    <add name="Connection_Local" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\work\WF\ScaleCalibration\ScaleCalibration\AppData\db_local.mdf;Integrated Security=True;Connect Timeout=30" />
  </connectionStrings>>
</configuration>

Le projet 2 doit avoir accès aux paramètres de configuration ... Créez les classes suivantes:

public class AssemblyConfiguration : MarshalByRefObject
{
    public static string GetConnectionString(string name)
    {
        Assembly callingAssembly = Assembly.GetEntryAssembly();
        var conStringCollection = ConfigurationManager.OpenExeConfiguration(callingAssembly.Location).ConnectionStrings;
        return conStringCollection?.ConnectionStrings[name].ConnectionString;
    }
}

Classe statique dans dll Project:

public static class DBConnection
{
    public static string ConnectionStringLocal => AssemblyConfiguration.GetConnectionString("Connection_Local");
}

Utilisation n'importe où dans le projet de bibliothèque de classes:

var xx = DBConnection.ConnectionStringLocal;

Si vous ne souhaitez pas lire la chaîne de connexion à chaque appel de fonction, créez une variable membre dans DBConnection et définissez-la lorsqu'elle est null, sinon renvoyez-la.

1
DrCrazyApe

en supposant que la question demande un fichier de configuration spécifique au projet dll, et non au fichier de configuration de l'application ou de l'application web, j'ai utilisé le code suivant pour obtenir les valeurs des clés de la section "sqlSection". (Une mise en garde est que ce fichier de configuration - même s'il est configuré pour copier à tout moment - n'est pas automatiquement copié sur une version partielle d'une application Web. J'ai donc utilisé l'action géniale de pré-construction d'une ligne pour copier le fichier mentionné dans cet article https://stackoverflow.com/a/40158880/1935056 ). 

voici l'intégralité du fichier de configuration dll 

<?xml version="1.0" encoding="utf-8" ?>


<sqlSection>

<add key="sql1" value="--statement--"/>
</sqlSection>

c'est le code c #. 

 string GetSqlStatement(string key)
    {
            string path =   Path.GetDirectoryName(Assembly.GetCallingAssembly().CodeBase) + @"\DataLayer.dll.config";

        XDocument doc = XDocument.Load(path);

        var query = doc.Descendants("sqlSection").Nodes().Cast<XElement>().Where(x => x.Attribute("key").Value.ToString() == key).FirstOrDefault();

        if (query != null)
        {
            return query.Attribute("value").Value.ToString();
        }
1
civilator

Mon code pour lire le fichier de configuration

Int32 FilesCountLimit = Convert.ToInt32(ConfigurationManager.AppSettings["FilesTotalCount"]);
    long FilesLengthLimit = Convert.ToInt64(ConfigurationManager.AppSettings["FilesTotalSize"]);

exemple pour mon fichier app.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="FilesTotalCount" value="1000" />
    <add key="FilesTotalSize" value="500000000" />
  </appSettings>
</configuration>

Si plusieurs projets sont répertoriés dans votre solution, assurez-vous que les paramètres de l'application figurent dans le projet de démarrage, sinon vous obtiendrez la réponse Null.

1
The champ