begrüßt Sie herzlich zum Vortrag auf der VODC 2006 Konfiguration von.net Applikationen Dozent Michael Fischer Copyright 2006 Fischer & Consultants GmbH (F&C) Martinstrasse 1 44137 Dortmund www.appfact.com Kontakt: Michael Fischer Email mifi@appfact.de Phone +49 (172) 6801489 Fax +49 (941) 599212011 Hinweis Zum Zeitpunkt der Konferenz war der Design-Support für Application Settings noch nicht Bestandteil der aktuellen Beta von Vulcan.NET. Dieses Feature ein Bestandteil der Visual Studio Integration war jedoch inoffiziell als Bestandteil des fertigen Produktes angekündigt. Die Beispiele in dieser Präsentation verwenden daher leider noch Code, der in C# und nicht in Vulcan.NET geschrieben ist, um die Konzepte schon zu diesem frühen Zeitpunkt demonstrieren zu können. 1
Inhalt 1.Historie 2.Grundlagen 3.SimpleCSharpSample: Konfiguration (fast) ohne Code 6.Mehr aus System.Configuration 7.Fragen 4.Selbst ist der Entwickler I: ConfigurationManager 5.Selbst ist der Entwickler II: Eigenes Setting Objektmodell MSDN-Beispiel Folie 2 von 21 Abstract: Wie hätten Sie's denn gerne? Konfiguration von Vulcan.NET Applikationen Die Konfiguration von Applikationen ist so alt wie die Software-Entwicklung selbst und ihre Speicherung vielfältigen Moden unterworfen. Die Palette reicht von hart codierten Einstellungen, den legendären INI-Dateien und der (zu Recht) gehassten Registry über Einträgen in SQL-Tabellen bis hin zum Dernier Cri: XML-Dateien. Als Teil des.net Framework 2.0 steht Vulcaniern die Bibliothek System.Configuration zur Verfügung, ein mächtiges Framework für die Speicherung von Applikations- und Anwenderspezifischen Einstellungen, dessen Leistungsfähigkeit sich nicht gerade auf den ersten Blick erschließt. Michael Fischer nimmt sich die Konfiguration von Vulcan.NET Programmen in allen Facetten vor. In seiner Session begegnen sie einfachen Konfigurationseinstellungen für das gesamte Programm, lokalen oder wandernden Benutzereinstellungen und persistenten Konfigurationsobjekten. Sie schließen Freundschaft mit dynamisch konfigurierbaren Eigenschaften im Formular-Editor von Visual Studio, lernen das PropertyGrid lieben und bekommen einen allgemein verwendbaren und einsatzbereiten Dialog für Benutzereinstellungen geliefert. Und wer sich noch nie Vulcan.NET im Visual Studio angesehen hat, bekommt einen ersten Eindruck der neuen Entwicklungsumgebung. 2
1. Historie Meine kleine Historie von Konfigurationsquellen DATA-Zeilen in eigenen Modulen GW-Basic: hartcodierte Einstellungen im Code INI-Dateien Clipper: Zugriffsklasse (Eigenentwicklung) auf Basis von FOpen VO: Zugriffsklasse (Eigententwicklung) auf Basis des Win32 API Registry VO: Zugriffsklasse (Eigententwicklung) auf Basis des Win32 API SQL VO: direkter Zugriff auf Tabellen über SQL-Klassen XML VO: direkter Zugriff über Klassen des MSXML-Parsers C#: Application Settings über System.Configuration Folie 3 von 21 Zu den DATA-Zeilen In GW-Basic hatten wir z.b. in meiner damaligen Firma die Escape- Sequenzen zur Bildschirmsteuerung der Terminals unterschiedlicher Hersteller in DATA-Zeilen hinterlegt. Für jedes unterstützte Terminal gab es ein Modul. Um die Software für andere Terminals zu erstellen, musste nur das entsprechende Modul gelinkt werden. Immerhin. 3
1. Historie Probleme der Vergangenheit Hartcodierte Settings können nur vom Entwickler geändert werden INI-Dateien robust und einfach aber relativ ungeeignet für komplexe Einstellungen (z.b. Bäume) Registry $%*# Registry SQL ohne Verbindung zur Datenbank keine Einstellungen (und wo kommt dann der Connection String hin?) XML VO: Keine Unterstützung durch fertige Klassen, Rechteprobleme Folie 4 von 21 XML Ein Problem war z.b. der relativ naive Ansatz, über den MS XML-Parser direkt in XML-Dateien im Verzeichnis der Applikation zu schreiben, also C:\Programme\MeineApplikation\Config.XML. Das funktioniert solange, wie der Benutzer Schreibrechte auf diesem Verzeichnis hat, die benötigt der XML-Parser nämlich. Viele Firmen haben aber über Policies Standard- Benutzern Schreibrechte auf das Programme-Verzeichnis entzogen. 4
2. Grundlagen Application Settings unter.net 2.0 Gilt für Windows Applikationen (System.Windows.Forms). Design-Zeit Unterstützung für VB.NET und C# Eigener Editor für Settings Verfügbarkeit der Settings im Form-Editor Einfacher Zugriff im Code My Namespace in VB.NET Properties Namespace in C# Für diese Möglichkeiten muss keine Zeile Code geschrieben werden. Darüberhinaus: Sehr umfangreiche Basisklassen für eigene Erweiterungen System.Configuration Namespace Folie 5 von 21 Hinweise Die Klassen zur Handhabung von Konfigurationseinstellungen sind im von Vulcan.NET verwendeten Framework 2.0 gegenüber der Version 1.1 erheblich erweitert worden. Diese reichten in den meisten Fällen nicht aus. So gab es z.b. keine fertige Funktionalität zur Speicherung von Benutzerbezogenen Einstellungen. Entsprechend gibt es auf dem Internet viele Artikel und Beispielklassen (bis hin zum Configuration Application Block der Enterprise Library 1.1, einer Bibliothek von Microsoft selbst), die die Schwächen des Frameworks 1.1 ausmerzen. Diese Ansätze sind i.d.r. heute obsolet. Achten Sie bei Artikeln oder Code zum Thema Configuration oder Application Settings daher unbedingt darauf, dass diese für.net 2.0 geschrieben wurden. Die in dieser Präsentation beschriebenen Verfahren gelten nur für Windows Applikationen. Für Web Applikationen (ASP.NET) gibt es leicht veränderte Ansätze. 5
2. Grundlagen Eigenschaften von Settings Name unter dem die einzelne Einstellung zur Laufzeit angesprochen wird. Typ des Werts. Neben Standard-Datentypen geht hier jede Klasse. Gültigkeitsbereich (Scope) ist entweder Application oder User. Wert Folie 6 von 21 6
2. Grundlagen Bereiche von Settings Application Application Settings gelten für alle Benutzer einer Applikation. Sie sind read only zur Laufzeit, d.h. die Applikation selbst kann sie aus Sicherheitsgründen nicht ändern. User User Settings gelten nur für den aktuellen Benutzer (Windows). Sie sind read/write zur Laufzeit, d.h. die Applikation kann sie verändern und speichern. Sie lassen sich weiter unterscheiden: non-roaming (lokal für den Benutzer auf dem jeweiligen Rechner, Default) roaming (wandert bei Anmeldung mit dem aktuellen Benutzer im Netz) Folie 7 von 21 Application Settings können dagegen selbstverständlich von einem Benutzer außerhalb der Applikation durch direkte Änderung der entsprechenden XML- Datei verändert werden. Wenn er denn Schreibrechte auf der Datei hat 7
2. Grundlagen Pfade für User Settings <app>.config im Programmverzeichnis nur lesend für Defaults user.config unter Dokumente und Einstellungen private void btnsettingdirectories_click(object sender, EventArgs e) { StringBuilder msg = new StringBuilder(); msg.appendformat("roaming: {0}\n", Application.UserAppDataPath); msg.appendformat("local: {0}", Application.LocalUserAppDataPath); MessageBox.Show(msg.ToString(), "Storage of User Settings"); } Folie 8 von 21 Hinweis Der Name der Firma sowie der Name und die Version der Applikation, die in den Pfad mit eingebaut werden, werden über die Attribute in der AssemblyInfo definiert. 8
3. Beispiel: Konfiguration (fast) ohne Code Die Beispiel-Applikation Neue C# Windows Application AssemblyInfo.cs ausfüllen! Firmenname, Applikationsname und Version finden Einzug in den Namen der User-Konfigurationsdatei Form gestalten Folie 9 von 21 Refactoring Rename der Form von Form1.cs in MainForm.cs führt nicht nur zu einem Rename der Form selbst sondern auch zur Änderung allen abhängigen Codes, z.b. dem Aufruf in Program.cs. Anmerkungen zum Form Editor Man beachte die Positionierungshilfe bei der Platzierung der Controls Verwendung von Anchor (wird bereits zur Design-Zeit berücksichtigt) Properties: Misc, AutoComplete für eine Verzeichnisauswahl 9
3. Beispiel: Konfiguration (fast) ohne Code Definition von Settings in Visual Studio Editor Aufruf über Properties-Dialog, SettingsTab Alternativ Doppelklick auf Properties, Settings im Solution Explorer Folie 10 von 21 Synchronize Über den Synchronize-Button können während einer Testphase während der Bedienung der Applikation gespeicherte User Settings (user.config unterhalb von Dokumente und Einstellungen) wieder gelöscht werden. View Code Generiert beim ersten Mal die Settings-Klasse, in der man selbst eigenen Code schreibt. 10
3. Beispiel: Konfiguration (fast) ohne Code Generierter Code app.config XML-Konfigurationsdatei mit allen definierten Einstellungen wird beim Build mit dem Namen der EXE in das bin-verzeichniskopiert Settings.Designer.cs gehört zum Namespace Properties generierte sealed partial class Singleton fertige Properties zum Zugriff auf die Einstellungen Default-Werte als Attribute Settings.cs andere Hälfte der generierten partial class für eigene Erweiterungen, z.b. Event Handler Folie 11 von 21 Notiz Das Verfahren, generierte Klassen in eine interne, partial Klasse mit dem generierten Code einerseits und einer zweiten, für die Bearbeitung bestimmten partial Klasse, findet in C# z.b. auch beim Form Editor statt. In gewisser Weise entspricht das dem bewährten Verfahren (Best Practice) unter VO, von den vom Window Editor generierten Klassen in einem eigenen Modul zu vererben und dort seinen Code zu platzieren. 11
3. Beispiel: Konfiguration (fast) ohne Code app.config Folie 12 von 21 Wer möchte, kann die XML-Datei auch direkt bearbeiten, Visual Studio bietet eine recht ordentliche Code Completion auch für XML. 12
3. Beispiel: Konfiguration (fast) ohne Code Settings.Designer.cs Folie 13 von 21 Die generierte Settings Klasse vererbt von ApplicationSettingsBase aus dem System.Configuration Namespace und erhält so ihre Grundfunktionalität, z.b. den Indexer für die einzelnen Properties und die Persistenz der Settings über einen Provider. 13
3. Beispiel: Konfiguration (fast) ohne Code Verwendung von Settings im Code Settings können über den PropertiesNamespace im Code direkt angesprochen werden. Beispiel-Methoden der TestForm Klasse. Folie 14 von 21 14
3. Beispiel: Konfiguration (fast) ohne Code Verwendung von Settings im Form Editor Control selektieren Properties, Data, ApplicationSettings, PropertyBinding, Text dort die Combobox öffnen und das gewünschte Application Setting wählen der Default Wert ist bereits im Form Editor zu sehen Definition neuer Settings auch direkt aus Form Editor Folie 15 von 21 15
3. Beispiel: Konfiguration (fast) ohne Code Wo kommen die Settings zur Laufzeit her Settings werden in dieser Reihenfolge gesucht user.config aus dem Pfad unterhalb von Dokumente und Einstellungen gilt nur für User Settings.config im Verzeichnis der EXE EXE oder DLL Keine.config gefunden Default-Werte als Attribute der generierten SettingsKlasse im Code! Folie 16 von 21 16
4. ConfigurationManager Startpunkt für direkten, selbst codierten Zugriff auf Konfigurationsdaten Neu in.net 2.0 Ersetzt AppSettingsReader Referenz auf system.configuration notwendig Umfangreicher Baum von Klassen für Section Groups, Sections, Properties Folie 17 von 21 17
4. ConfigurationManager Dient auch dem Schreiben von Konfigurationseinstellungen niemals selbst per XMLReader oder XMLWriter die Dateien öffnen ansonsten drohen SecurityProbleme Funktioniert bereits in Vulcan.NET Folie 18 von 21 18
5. Eigene Objektmodelle für Settings Demonstration des MSDN Beispiels von Bryan Porter Download von msdn.microsoft.com Eigene Klassen vererben von Basisklassen in System.Configuration Intensive Verwendung von Attributen Generische Programmierung Alternative Darstellung über PropertyGrid Folie 19 von 21 Zur Download-Adresse mit Code siehe die Literaturhinweise in den Notizen der letzten Folie. 19
6. Mehr aus System.Configuration Weitere Bereiche Validatoren Klassen zur Überprüfung von Werten Verschlüsselte Konfigurationsdateien DpapiProtectedConfigurationProvider Übernahme von Benutzereinstellungen bei Programmupdates Der Pfad unter Dokumente und Einstellungen ändert sich Properties.Settings.Default.Upgrade(); Andere Speicherorte Default ist LocalFileSettingsProvider Base Class SettingsProvider für eigene Provider Folie 20 von 21 20
7. Fragen? Folie 21 von 21 21
Vielen Dank für Ihre Aufmerksamkeit! Gesellschaft für Softwareentwicklung und Unternehmensberatung mbh Martinstrasse 1 44137 Dortmund www.appfact.com mifi@appfact.de Literaturverzeichnis Porter, Bryan: Configure This; Parameterize Your Apps Using XML Configuration In The.NET Framework 2.0; in MSDN Magazine 06.2006. http://msdn.microsoft.com/msdnmag/issues/06/06/configurethis/ Stoecker, Matt: Using Settings in C#; in Visual Studio 2005 Technical Articles. http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnvs05/html/settingscs_rl.asp 22