web-dev-qa-db-fra.com

app.config pour une bibliothèque de classe

Je ne peux pas voir un fichier app.config généré pour une bibliothèque de classes par l'assistant VS2008. Dans mes recherches, j'ai trouvé que dans une application, il n'y a qu'un seul app.config. 

Est-ce une mauvaise chose d’ajouter manuellement un fichier app.config à une bibliothèque de classes ou existe-t-il d’autres méthodes qui serviraient l’objet d’un fichier app.config dans la bibliothèque de classes?

J'ai besoin de stocker des informations de configuration log4net dans le fichier app.config.

59
logeeks

Vous devez généralement ne pas ajouter un fichier app.config à un projet de bibliothèque de classes; il ne sera pas utilisé sans une légère flexion et torsion de votre part. Cela ne nuit pas au projet de bibliothèque - cela ne fera rien du tout.

Au lieu de cela, vous configurez l'application qui utilise votre bibliothèque; donc les informations de configuration nécessaires y iraient. Chaque application pouvant utiliser votre bibliothèque aura probablement des exigences différentes, ce qui est donc logique, également.

82
Andrew Barber

Je ne sais pas pourquoi cette réponse n'a pas déjà été donnée:

Différents appelants de la même bibliothèque utiliseront généralement des configurations différentes. Cela implique que la configuration doit résider dans l'application executable et non dans la bibliothèque de classes.

Vous pouvez créer un fichier app.config dans le projet de bibliothèque de classes. Il contiendra les configurations par défaut pour les éléments que vous créez dans la bibliothèque. Par exemple, il contiendra des chaînes de connexion si vous créez un modèle Entity Framework dans la bibliothèque de classes.

Cependant, ces paramètres ne seront pas utilisés par l'application exécutable appelant la bibliothèque. Au lieu de cela, ces paramètres peuvent être copiés du fichier library.dll.config dans le fichier app.config ou web.config de l'appelant, de sorte qu'ils puissent être modifiés pour être spécifiques à l'appelant et à l'environnement dans lequel l'appelant déployé.

C’est ce qui se passe avec .NET depuis le premier jour.

42
John Saunders

Jon, beaucoup d'opinions ont été données qui n'ont pas répondu correctement à votre question.

Je vais donner mon avis et ensuite vous dire comment faire exactement ce que vous avez demandé.

Je ne vois aucune raison pour laquelle une assemblée ne pourrait pas avoir son propre fichier de configuration. Pourquoi le premier niveau de atomicy (est-ce un vrai mot?) Se situe au niveau de l'application? Pourquoi pas au niveau de la solution? C’est une décision arbitraire, fondée sur des conjectures et, à ce titre, un AVIS. Si vous deviez écrire une bibliothèque de journalisation et y inclure un fichier de configuration, celui-ci serait utilisé globalement. Pourquoi ne pourriez-vous pas vous connecter à la fonctionnalité des paramètres intégrés? Nous l'avons tous fait ... essayé de fournir une fonctionnalité "puissante" à d'autres développeurs. Comment? En faisant des hypothèses qui se traduisent par des restrictions. C'est exactement ce que MS a fait avec le cadre de paramétrage, vous devez donc "le tromper" un peu.

Pour répondre directement à votre question, ajoutez simplement le fichier de configuration manuellement (xml) et nommez-le pour correspondre à votre bibliothèque et inclure l'extension "config". Exemple:

MyDomain.Mylibrary.dll.Config

Ensuite, utilisez le ConfigurationManager pour charger le fichier et accéder aux paramètres:

string assemblyPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath;
Configuration cfg = ConfigurationManager.OpenExeConfiguration(assemblyPath);
string result = cfg.AppSettings.Settings["TEST_SETTING"].Value;

Notez que cela supporte entièrement la hiérarchie machine.config, même si vous avez explicitement choisi le fichier de configuration de l'application. En d'autres termes, si le paramètre n'est pas là, il sera résolu plus haut. Les paramètres remplaceront également les entrées machine.config.

34
Todd Beaulieu

Si vous souhaitez configurer la journalisation de votre projet à l'aide de log4Net, tout en utilisant une bibliothèque de classes, aucun fichier de configuration n'est réellement nécessaire. Vous pouvez configurer votre enregistreur log4net dans une classe et utiliser cette classe comme bibliothèque.

Comme log4net fournit toutes les options pour le configurer.

Veuillez trouver le code ci-dessous.

public static void SetLogger(string pathName, string pattern)
        {
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = pattern;
            patternLayout.ActivateOptions();

            RollingFileAppender roller = new RollingFileAppender();
            roller.AppendToFile = false;
            roller.File = pathName;
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.MaximumFileSize = "1GB";
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            MemoryAppender memory = new MemoryAppender();
            memory.ActivateOptions();
            hierarchy.Root.AddAppender(memory);

            hierarchy.Root.Level = log4net.Core.Level.Info;
            hierarchy.Configured = true;
      }

Maintenant, au lieu d'appeler XmlConfigurator.Configure (nouveau FileInfo ("app.config")), vous pouvez appeler directement SetLogger avec le chemin et le modèle souhaités pour définir le consignateur dans la fonction de démarrage d'application Global.asax. 

Et utilisez le code ci-dessous pour enregistrer l'erreur.

        public static void getLog(string className, string message)
        {
            log4net.ILog iLOG = LogManager.GetLogger(className);
            iLOG.Error(message);    // Info, Fatal, Warn, Debug
        }

En utilisant le code suivant, vous n'avez pas besoin d'écrire une seule ligne ni dans l'application web.config ni dans le fichier app.config de la bibliothèque.

6
Rahul

En fait, la bibliothèque de classes que vous implémentez récupère les informations de app.config à l’intérieur de l’application qui les consomme. La méthode la plus correcte pour implémenter la configuration des bibliothèques de classes sur .net dans VS préparez app.config dans l'application pour configurer tout ce qu'elle consomme, comme la configuration des bibliothèques.

J'ai un peu travaillé avec log4net et j'ai constaté que celui qui préparait l'application avait toujours une section pour la configuration de log4net dans le principal app.config.

Je espère que vous trouverez ces renseignements utiles.

Rendez-vous et postez des commentaires sur la solution que vous avez trouvée.

MODIFIER:

Au lien suivant, vous avez un app.config avec la section pour log4net:

http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx

4
Amedio

En fait, dans de rares cas, vous pouvez stocker app.config dans des bibliothèques de classes (en ajoutant manuellement) et l’analyser avec OpenExeConfiguration .

 var fileMap =
    new ExeConfigurationFileMap {ExeConfigFilename = 
    @"C:\..somePath..\someName.config"};
 System.Configuration.Configuration config =
    ConfigurationManager.OpenMappedExeConfiguration(fileMap, 
    ConfigurationUserLevel.None);

Vous devriez vraiment estimer le besoin réel de cela. Pour les données abstraites, ce n'est pas la meilleure solution, mais les "sections de configuration" pourraient être très utiles !!

Par exemple, nous avons organisé notre architecture WCF N-Tier découplée, sans aucune métadonnée, simplement en utilisant Unity Container et Injection Factory sur la base de Channel Factory T. Nous avons ajouté externall ClassLibrary dll avec uniquement des interfaces [Contrat de service] et une application commune communes dans l'ordre pour lire les points de terminaison de la section clients et les ajouter/les modifier facilement à un endroit. 

4
Roma Borodov

Vous voulez ajouter App.config à votre bibliothèque/class tests , si vous utilisez un traceur/enregistreur. Sinon, rien n'est enregistré lorsque vous exécutez le test via un programme d'exécution tel que TestDriven.Net.

Par exemple, j’utilise TraceSource dans mes programmes, mais l’exécution des tests ne consigne rien, sauf si j’ajoute également un fichier App.config avec la configuration de trace/log dans la bibliothèque de classes de test.

Sinon, ajouter App.config à une bibliothèque de classes ne fait rien.

3
Daniel Pelsmaeker

Il n'y a pas d'ajout automatique de fichier app.config lorsque vous ajoutez un projet de bibliothèque de classes à votre solution.

À ma connaissance, il n'y a pas d'indication contraire pour le faire manuellement. Je pense que c'est un usage courant.

A propos de log4Net config, vous n'avez pas besoin de mettre la configuration dans app.config, vous pouvez avoir un fichier conf dédié dans votre projet ainsi qu'un fichier app.config en même temps.

ce lien http://logging.Apache.org/log4net/release/manual/configuration.html vous donnera des exemples concernant les deux méthodes (section dans app.config et le fichier de configuration autonome log4net)

1
Bruno

Votre réponse pour une création non manuelle d'un app.config est l'onglet Propriétés/Paramètres du projet Visual Studio.

Lorsque vous ajoutez un paramètre et que vous enregistrez, votre application.config est créée automatiquement . À ce stade, un tas de code est généré dans un espace de noms {votre bibliothèque de classes. Les paramètres eux-mêmes seront placés dans les paramètres applicationSettings de app.config.

 <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="ClassLibrary.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
</configSections>
<applicationSettings>
    <ClassLibrary.Properties.Settings>
        <setting name="Setting1" serializeAs="String">
            <value>3</value>
        </setting>
    </BookOneGenerator.Properties.Settings>
</applicationSettings>

Si vous avez ajouté un paramètre d'application appelé Setting1 = 3, une propriété appelée Setting1 sera créée. Ces propriétés font désormais partie de la compilation du binaire et sont décorées avec un DefaultSettingValueAttribute qui est défini sur la valeur que vous avez spécifiée au moment du développement.

     [ApplicationScopedSetting]
    [DebuggerNonUserCode]
    [DefaultSettingValue("3")]
    public string Setting1
    {
        get
        {
            return (string)this["Setting1"];
        }
    }

Ainsi, comme dans le code de votre bibliothèque de classe, vous utilisez ces propriétés si un paramètre correspondant n'existe pas dans le fichier de configuration d'exécution, il utilisera la valeur par défaut. Ainsi, l’application ne plantera pas parce qu’il manque une entrée de paramètre, ce qui est très déroutant pour la première fois lorsque vous ne savez pas comment cela fonctionne ..___. Maintenant, vous vous demandez comment spécifier notre nouvelle valeur dans un fichier. bibliothèque déployée et éviter que la valeur de paramètre par défaut soit utilisée? 

Cela se produira si nous configurons correctement le fichier app.config de l'exécutable. Deux étapes. 1. nous faisons savoir que nous aurons une section de paramètres pour cette bibliothèque de classes et 2. avec de petites modifications, nous collerons le fichier config de la bibliothèque de classes dans l'exécutable config. (Il existe une méthode permettant de conserver le fichier de configuration de la bibliothèque de classes à l’extérieur et de le référencer à partir de la configuration de l’exécutable.

Donc, vous pouvez avoir un app.config pour une bibliothèque de classes, mais cela ne sert à rien si vous ne l'intégrez pas correctement à l'application parent . Regardez ici ce que j'ai écrit il y a quelque temps: link

0
Mircea Ion

Je recommanderais d'utiliser Properties.Settings pour stocker des valeurs telles que ConnectionStrings et ainsi de suite à l'intérieur de la bibliothèque de classes. C’est là que toutes les chaînes de connexion sont stockées par suggestion de Visual Studio lorsque vous essayez d’ajouter un adaptateur de table, par exemple. entrez la description de l'image ici

Et ensuite, ils seront accessibles en utilisant ce code partout dans la bibliothèque de clas

var cs=  Properties.Settings.Default.[<name of defined setting>];
0
sishanov