Frage Wie kann ich von einer DLL aus auf die App-Konfiguration zugreifen?


Ich habe kürzlich einen Teil meiner Winform-App in einer .dll-Datei veröffentlicht. Einige der Klassen in dieser DLL möchte Benutzereinstellungen abrufen / speichern. Die Klassen haben gerade die VS-generierte Einstellungsdatei verwendet Properties.Settings.Default.SomeSetting = var;Properties.Settings.Default.Save() etc.

Welche Optionen habe ich jetzt, als ich diesen Code in eine Klassenbibliothek / .dll verschoben habe?


7
2018-02-22 19:29


Ursprung


Antworten:


Die hosting-Anwendung sollte die Schnittstelle zur Konfigurationsdatei behandeln, nicht die DLL. Entweder

  1. Übergeben Sie alle Einstellungen, die in der DLL als Parameter gelesen oder geändert werden müssen, oder

  2. Übergeben Sie eine Name-Wert-Auflistung von Einstellungen, die von der DLL geändert werden können, und speichern Sie alle Änderungen, die von der DLL an die Auflistung vorgenommen werden, wenn Steuerung an die aufrufende Anwendung zurückgibt.

Dies ist im Prinzip ähnlich wie das Entfernen einer Datenbankschnittstelle von der Geschäftsschicht einer mehrschichtigen Anwendung und das Einkapseln derselben in eine Datenschicht.


3
2018-02-22 19:46



Es macht für mich wenig Sinn, eine DLL zu haben, die Benutzereinstellungen speichert. Eine DLL ist eine Bibliothek, keine Anwendung und interagiert nicht direkt mit dem Benutzer. Wenn Klassen in der DLL Zugriff auf Benutzereinstellungen benötigen, können Sie sie als Parameter übergeben.


2
2018-02-22 19:42



Die Properties-Klasse wird automatisch generiert. Es ist wirklich ein Wrapper für die Konfigurationsdatei. Wenn Sie Ihr Design nicht ändern möchten, gehen Sie einfach in den Code und kopieren Sie ihn in Ihre DLL. Aber denk daran, dass es nicht mehr magisch aufrechterhalten (regeneriert) wird. Oder Sie können ConfigurationManager verwenden, um direkt zur Konfigurationsdatei zu gelangen.


2
2018-02-22 19:44



Ich würde es nicht empfehlen (verwenden Sie besser Ihre eigene Klasse für Einstellungen), aber Sie können dies versuchen:

string sectionName = "applicationSettings/" + 
            appName + ".Properties.Settings";
         System.Configuration.ClientSettingsSection section = 
            (System.Configuration.ClientSettingsSection)
             System.Configuration.ConfigurationManager.GetSection(sectionName);
         foreach (SettingElement setting in section.Settings)
         {
            string value = setting.Value.ValueXml.InnerText;
            string name = setting.Name;
            if (name.ToLower().StartsWith(searchName.ToLower()))
            {
               return value;
            }
         }

0
2018-02-22 19:51



Für diejenigen, die Einstellungen von lesen müssen userDirectory/user.config, hier ist eine Lösung:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
ConfigurationSectionGroup userSettings = config.GetSectionGroup("userSettings");
ClientSettingsSection settings = (ClientSettingsSection)userSettings.Sections.Get("[applicationName].Properties.Settings");
SettingElement elem = settings.Settings.Get([settingName]);
var sett = elem.Value.ValueXml.InnerText;

0
2018-02-20 22:27