95 votes

app.config pour une bibliothèque de classes

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

Est-ce une mauvaise chose d'ajouter manuellement un app.config à une bibliothèque de classes ou existe-t-il d'autres méthodes qui permettent d'utiliser un app.config dans une bibliothèque de classes ?

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

3 votes

Vous pouvez lire le fichier de configuration de votre projet exécutable à partir de votre bibliothèque.

116voto

Andrew Barber Points 25990

Vous devez généralement no ajouter un app.config à un projet de bibliothèque de classe ; il ne sera pas utilisé sans quelques douloureuses flexions et torsions de votre part. Il n'est pas blesser le projet de bibliothèque - il ne fera rien du tout.

Au lieu de cela, vous configurez l'application qui utilise votre bibliothèque ; les informations de configuration requises s'y trouvent donc. Chaque application qui utilise votre bibliothèque a probablement des exigences différentes, ce qui est logique.

52voto

John Saunders Points 118808

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

Les différents appelants de la même bibliothèque utiliseront, en général, des configurations différentes. Ceci implique que la configuration doit résider dans le fichier exécutable et non dans la bibliothèque de classes.

Vous pouvez créer un app.config dans le projet de bibliothèque de classes. Il contiendra les configurations par défaut des éléments que vous créez dans la bibliothèque. Par exemple, il contiendra les 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 qui appelle la bibliothèque. En revanche, ces paramètres peuvent être copiés du fichier library.dll.config dans le fichier app.config ou web.config de l'appelant, afin qu'ils puissent être modifiés pour être spécifiques à l'appelant et à l'environnement dans lequel l'appelant est déployé.

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

49voto

Rastla Points 61

Jon, beaucoup d'avis ont été donnés qui ne répondaient pas correctement à votre question.

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

Je ne vois pas pourquoi une assemblée ne pourrait pas avoir son propre fichier de configuration. Pourquoi le premier niveau d'atomicité (est-ce un vrai mot ?) se situe-t-il au niveau de l'application ? Pourquoi pas au niveau de la solution ? C'est une décision arbitraire, une meilleure supposition et en tant que telle, une OPINION. Si vous deviez écrire une bibliothèque de journalisation et que vous vouliez inclure un fichier de configuration pour celle-ci, qui serait utilisé globalement, pourquoi ne pourriez-vous pas vous accrocher à la fonctionnalité de paramètres intégrés ? Nous l'avons tous fait... essayer 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ètres, donc vous devez le "tromper" un peu.

Pour répondre directement à votre question, il suffit d'ajouter manuellement le fichier de configuration (xml) et de le nommer pour qu'il corresponde à votre bibliothèque et pour inclure l'extension "config". Exemple :

MyDomain.Mylibrary.dll.Config

Ensuite, utilisez le ConfigurationManager pour charger le fichier et les paramètres d'accès :

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

Notez que cela prend entièrement en charge la hiérarchie de 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 présent, il sera résolu à un niveau supérieur. Les paramètres remplaceront également les entrées du fichier machine.config.

10voto

Amedio Points 683

En fait, la bibliothèque de classe que vous implémentez, récupère des informations à partir de app.config à l'intérieur de l'application qui la consomme, donc, la manière la plus correcte d'implémenter la configuration pour les bibliothèques de classes en .net dans VS est de préparer app.config dans l'application pour configurer tout ce qu'elle consomme, comme la configuration des bibliothèques.

J'ai travaillé un peu avec log4net, et j'ai constaté que celui qui préparait l'application avait toujours une section pour la configuration de log4net à l'intérieur de la page principale. app.config .

Cette configuration, par exemple a un log4net section.

6voto

Rahul Points 182

Si vous voulez configurer l'enregistrement de votre projet en utilisant log4Net, tout en utilisant une bibliothèque de classe, il n'y a pas besoin d'un fichier de configuration. Vous pouvez configurer votre logger 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(new FileInfo("app.config")), vous pouvez directement appeler SetLogger avec le chemin et le modèle souhaités pour définir le logger dans la fonction de démarrage de l'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 le web.config de l'application ni dans le app.config de la bibliothèque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X