it-swarm.com.de

app.config für eine Klassenbibliothek

Ich kann keine app.config-Datei sehen, die vom VS2008-Assistenten für eine Klassenbibliothek generiert wurde. In meiner Recherche habe ich festgestellt, dass in einer Anwendung nur eine app.config vorhanden ist. 

Ist es eine schlechte Sache, eine app.config manuell einer Klassenbibliothek hinzuzufügen, oder gibt es andere Methoden, die dem Zweck einer app.config in der Klassenbibliothek dienen?

Ich muss log4net config-Informationen in der app.config-Datei speichern.

59
logeeks

Im Allgemeinen sollten Sie keine app.config -Datei zu einem Klassenbibliotheksprojekt hinzufügen. Es wird nicht verwendet, ohne dass Sie sich schmerzhaft biegen und drehen müssen. Es schadet dem Bibliotheksprojekt überhaupt nicht - es tut einfach überhaupt nichts.

Stattdessen konfigurieren Sie die Anwendung, die Ihre Bibliothek verwendet. Die erforderlichen Konfigurationsinformationen würden also dorthin gehen. Jede Anwendung, die Ihre Bibliothek möglicherweise verwendet, hat wahrscheinlich andere Anforderungen, daher ist dies auch logisch sinnvoll.

81
Andrew Barber

Ich weiß nicht, warum diese Antwort noch nicht gegeben wurde:

Verschiedene Anrufer derselben Bibliothek verwenden im Allgemeinen unterschiedliche Konfigurationen. Dies bedeutet, dass sich die Konfiguration in der executable -Anwendung befinden muss und nicht in der Klassenbibliothek.

Sie können eine app.config innerhalb des Klassenbibliothekprojekts erstellen. Sie enthält Standardkonfigurationen für Elemente, die Sie in der Bibliothek erstellen. Es enthält beispielsweise Verbindungszeichenfolgen, wenn Sie ein Entity Framework-Modell in der Klassenbibliothek erstellen.

Diese Einstellungen werden jedoch nicht von der ausführbaren Anwendung verwendet, die die Bibliothek aufruft. Stattdessen können diese Einstellungen aus der Datei library.dll.config in die app.config oder web.config des Aufrufers kopiert werden, sodass sie so geändert werden können, dass sie spezifisch für den Aufrufer und die Umgebung sind, in der sich der Aufrufer befindet eingesetzt.

So ist es seit .NET mit .NET.

42
John Saunders

Jon, viele Meinungen wurden abgegeben, die deine Frage nicht richtig beantwortet haben.

Ich werde MEINE MEINUNG geben und dann sagen, wie Sie genau das tun, wonach Sie gefragt haben.

Ich sehe keinen Grund, warum eine Assembly keine eigene Konfigurationsdatei haben kann. Warum ist die erste Ebene der Atomisierung (ist das ein echtes Wort?) Auf der Anwendungsebene? Warum nicht auf der Lösungsebene? Es ist eine willkürliche, nach bestem Wissen getroffene Entscheidung und somit eine STELLUNGNAHME. Wenn Sie eine Protokollierungsbibliothek schreiben und eine Konfigurationsdatei dafür hinzufügen möchten, wird diese global verwendet. Warum können Sie sich nicht in die eingebauten Einstellungsfunktionen einwählen? Wir haben alles getan ... Wir haben versucht, anderen Entwicklern "leistungsfähige" Funktionen zur Verfügung zu stellen. Wie? Durch die Annahme von Annahmen, die inhärent zu Einschränkungen führten. Das ist genau das, was MS mit dem Einstellungs-Framework getan hat, also muss man es ein bisschen täuschen.

Um Ihre Frage direkt zu beantworten, fügen Sie die Konfigurationsdatei einfach manuell hinzu (xml) und benennen Sie sie entsprechend Ihrer Bibliothek und mit der Erweiterung "config". Beispiel:

MyDomain.Mylibrary.dll.Config

Als nächstes laden Sie die Datei mit dem ConfigurationManager und greifen auf die Einstellungen zu:

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

Beachten Sie, dass dies die Heurarchie machine.config vollständig unterstützt, auch wenn Sie die App-Konfigurationsdatei explizit ausgewählt haben. Mit anderen Worten, wenn die Einstellung nicht vorhanden ist, wird sie höher aufgelöst. Die Einstellungen überschreiben auch die Einträge von machine.config.

34
Todd Beaulieu

Wenn Sie bei der Verwendung einer Klassenbibliothek Ihre Projektprotokollierung mithilfe von log4Net konfigurieren möchten, ist keine Konfigurationsdatei erforderlich. Sie können Ihren log4net-Logger in einer Klasse konfigurieren und diese Klasse als Bibliothek verwenden.

Log4net bietet alle Optionen zur Konfiguration.

Den Code finden Sie unten.

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;
      }

Jetzt können Sie anstelle von XmlConfigurator.Configure (neue FileInfo ("app.config")) SetLogger direkt mit dem gewünschten Pfad und Muster aufrufen, um den Logger in der Global.asax-Anwendungsstartfunktion festzulegen. 

Verwenden Sie den folgenden Code, um den Fehler zu protokollieren.

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

Durch die Verwendung des folgenden Codes müssen Sie weder in der Anwendung web.config noch in der app.config der Bibliothek eine einzelne Zeile schreiben.

6
Rahul

Tatsächlich ruft die Klassenbibliothek, die Sie implementieren, Informationen aus app.config in der Anwendung ab, in der sie verwendet wird. Daher ist die Implementierung der Konfiguration für Klassenbibliotheken in VS in VS die am besten geeignete Methode bereiten Sie app.config in der Anwendung vor, um alles, was es benötigt, zu konfigurieren, beispielsweise die Bibliothekskonfiguration.

Ich habe ein wenig mit log4net gearbeitet, und ich fand heraus, dass derjenige, der die Anwendung vorbereitete, immer einen Abschnitt für die Konfiguration von log4net in main app.config hatte.

Ich hoffe, Sie finden diese Informationen nützlich.

Wir sehen uns und posten Kommentare zu der gefundenen Lösung.

EDIT:

Beim nächsten Link haben Sie ein app.config mit dem Abschnitt für log4net:

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

4
Amedio

In einigen seltenen Fällen könnten Sie app.config in Klassenbibliotheken speichern (durch manuelles Hinzufügen) und nach OpenExeConfiguration parsen.

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

Sie sollten den tatsächlichen Bedarf wirklich einschätzen. Für abstrakte Daten ist dies nicht die beste Lösung, aber "Config Sections" kann sehr nützlich sein !!

Beispielsweise haben wir unsere N-Tier WCF-Architektur ohne Metadaten entkoppelt, indem wir Unity Container und Injection Factory basierend auf Channel Factory T basierten. Wir haben externall ClassLibrary dll mit nur [Service Contract] -Interfaces und allgemeiner app.config hinzugefügt Endpunkte aus dem Kundenbereich lesen und an einem Ort hinzufügen oder ändern. 

4
Roma Borodov

Sie möchten App.config zur Klassenbibliothek tests hinzufügen, wenn Sie einen Tracer/Logger verwenden. Sonst wird nichts protokolliert, wenn Sie den Test über einen Testläufer wie TestDriven.Net ausführen.

Ich verwende beispielsweise TraceSource in meinen Programmen, aber das Ausführen von Tests protokolliert nichts, es sei denn, ich füge der Testklassenbibliothek auch eine App.config -Datei mit der Ablaufverfolgungs-/Protokollkonfiguration hinzu.

Andernfalls führt das Hinzufügen von App.config zu einer Klassenbibliothek zu nichts.

3

Wenn Sie Ihrer Lösung ein Klassenbibliothekprojekt hinzufügen, wird die Datei app.config nicht automatisch hinzugefügt.

Meines Wissens gibt es keinen Gegenindikator dafür, dies manuell zu tun. Ich denke, das ist ein allgemeiner Gebrauch.

Bei log4Net config müssen Sie die config nicht in app.config einfügen. Sie können eine dedizierte conf-Datei in Ihrem Projekt sowie eine app.config-Datei gleichzeitig haben.

dieser Link http://logging.Apache.org/log4net/release/manual/configuration.html gibt Ihnen Beispiele zu beiden Möglichkeiten (Abschnitt in der Datei app.config und Standalone log4net conf).

1
Bruno

Die Antwort auf eine nicht manuelle Erstellung einer app.config lautet Visual Studio-Projekteigenschaften/Einstellungen.

Wenn Sie eine Einstellung hinzufügen und speichern, wird Ihre app.config automatisch erstellt. __ An diesem Punkt wird eine Reihe von Code in einem {yourclasslibrary. Properties} -Namensraum generiert, der die Ihren Einstellungen entsprechenden Eigenschaften enthält. Die Einstellungen selbst werden in den applicationSettings-Einstellungen von app.config abgelegt.

 <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>

Wenn Sie eine Einstellung für den Anwendungsbereich namens Setting1 = 3 hinzugefügt haben, wird eine Eigenschaft namens Setting1 erstellt. Diese Eigenschaften befinden sich im Kompilierungsbereich der Binärdatei und werden mit einem DefaultSettingValueAttribute -Ziel versehen, der auf den Wert festgelegt ist, den Sie zur Entwicklungszeit angegeben haben.

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

Wenn Sie also in Ihrem Klassenbibliothekcode diese Eigenschaften verwenden, wenn eine entsprechende Einstellung in der Laufzeitkonfigurationsdatei nicht vorhanden ist, wird der Standardwert verwendet. Auf diese Weise stürzt die Anwendung nicht ab, weil es an einem Einstellungseintrag fehlt, was beim ersten Mal sehr verwirrend ist, wenn Sie nicht wissen, wie diese Dinge funktionieren. Nun, Sie fragen sich, wie Sie unseren eigenen neuen Wert in einem angeben können implementierte Bibliothek und vermeiden, dass der Standardwert verwendet wird? 

Dies wird passieren, wenn wir die app.config der ausführbaren Datei ordnungsgemäß konfigurieren. Zwei schritte. 1. Wir machen es darauf aufmerksam, dass wir einen Einstellungsabschnitt für diese Klassenbibliothek haben werden, und 2. mit kleinen Änderungen fügen wir die Konfigurationsdatei der Klassenbibliothek in die ausführbare Konfigurationsdatei ein. (Es gibt eine Methode, mit der Sie die Konfigurationsdatei der Klassenbibliothek extern halten können und Sie nur in der Konfigurationsdatei der ausführbaren Datei darauf verweisen.

Sie können also eine app.config für eine Klassenbibliothek haben, aber es ist sinnlos, wenn Sie sie nicht ordnungsgemäß in die übergeordnete Anwendung integrieren. Hier sehen Sie, was ich vor einiger Zeit geschrieben habe: link

0
Mircea Ion

Ich würde empfehlen, Properties.Settings zu verwenden, um Werte wie ConnectionStrings usw. in der Klassenbibliothek zu speichern. Hier werden alle Verbindungszeichenfolgen auf Vorschlag von Visual Studio gespeichert, wenn Sie beispielsweise versuchen, einen Tabellenadapter hinzuzufügen. Bildbeschreibung hier eingeben

Und dann können sie mit diesem Code überall in der Clas-Bibliothek aufgerufen werden

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