Der-Albert.com sein Blog!


Dezember 2006 Entries

AppSettings und die Entwicklung im Team

Neulich hatte ich mit Thomas eine kurze Unterhaltung über die Problematik der Team-Entwicklung. Ein Problem sind die verschiedenen Einstellungen für die AppSettings und ConnectionStrings. Nun wurde dies auch bei mir akut und bin zur folgenden Lösung gekommen. Ich hatte schon vorher den Zugriff auf die AppSettings gekapselt, so habe ich nie direkt auf die AppSettings zugegriffen, sondern über statische Methode einer Klasse. Also nicht

string cn = ConfigurationManager.AppSettings["Database.ConnectionStringName"];

sondern [c#]

string cn = MySettings.ConnectionStringName;

Dies sah in der Implementation - vereinfacht - so aus

public class MySettings
{
    public static string ConnectionStringName
    {
        get
        {
            return ConfigurationManager.AppSettings["Database.ConnectionStringName"];
        }
    }
}

In Realität ist es ein wenig aufwendiger, so gab es Standardwerte, Typumwandlungen usw.

Nun gut, dies löst jedoch nicht direkt das Problem der Team-Entwicklung wenn z. B. verschiedene Entwickler verschiedene ConnectionStrings oder andere Angaben brauchen. Entwickler spezifische Settings-Dateien haben den Nachteil dass diese z.B. nicht in der Quellcode-Verwaltung zu landen oder dass man damit irgendwann einfach durcheinander kommt, da irgendwo die eigentliche Datei ja doch eingebunden werden muss. Deshalb nutze ich weiterhin den Ansatz von gemeinsamen Konfigurationsdateien, diese können jedoch Entwickler spezifische Einträge enthalten. Dazu muss der Entwickler nur identifiziert werden können, dies kann z. B. über den Benutzernamen oder den Namen des Rechner geschehen. Dies kann dann in der Konfiguration so ausehen.

<appSettings>
    <add key="Database.ConnectionStringName" value="MyDataBase"/>
    <add key="Database.ConnectionStringName.M00072348" value="MyDataBase.M00072348"/>
    <add key="Database.ConnectionStringName.M00072349" value="MyDataBase.M00072349"/>
    <add key="WeeksToDisplay" value="5"/>
    <add key="WeeksToDisplay.M00072348" value="2"/>
    <add key="Database.CacheExpirationTime" value="1.5"/>
</appSettings>
[...]
<connectionStrings>
    <add name="MyDataBase" connectionString="DefaultConnString"/>
    <add name="MyDataBase.M00072348" connectionString="DefaultConnStringForDev1"/>
    <add name="MyDataBase.M00072349" connectionString="DefaultConnStringForDev2"/>
</connectionStrings>

Zusätzlich zu den Standard-Settings existieren dann, bei Bedarf, zusätzliche Einträge denen einfach der Name des Rechners angehangen ist. Den Zugriff darauf natürlich wieder gekapselt, so dass der Zugriff bei der Anwendung Transparent abläuft. Dazu habe ich eine ApplicationSettings Klasse für C# 2.0 entwickelt die mir die Arbeit abnimmt. Diese sieht so aus (die vollständige Implemetation befindet sich weiter unten)

public abstract class ApplicationSettings
{
    protected static ApplicationSettings Instance
    {
        get;
    }    
    
    protected static void Initialize<T>(string identifier) 
          where T : ApplicationSettings;
    
    protected virtual string SettingsPrefix
    {
        get;
    }
    
    public T Get<T>(string settingsKey, T defaultValue);
}

Umgemünzt auf mein genanntes Beispiel von oben sieht dann meine Implementation von MySettings nun so aus.

public class MySettings : ApplicationSettings
{
    static MySettings()
    {
        Initialize<MySettings>(Environment.MachineName);
    }
    public static string ConnectionStringName
    {
        get { return Instance.Get("Database.ConnectionStringName", "DefaultConnString");}
    }
    public static int WeeksToDisplay
    {
        get { return Instance.Get("WeeksToDisplay", 6); }
    }
    public static double CacheExpirationTime
    {
        get { return Instance.Get("Database.CacheExpirationTime", 0.25);}
    }
}

Beim Initialize() könnte man auch Environment.UserName übergeben, dies hängt dann von den Anforderungen ab. Die SettingsPrefix Eigenschaft kann man noch überschreiben wenn man noch einen Prefix für alle Einstellungen vor dem Namen des Keys braucht.

    string cn = MySettings.ConnectionStringName;
    int weeks = MySettings.WeeksToDisplay;
    double time = MySettings.CacheExpirationTime;

Mit meiner ApplicationSettings-Klasse hat man einen einfachen, typsicheren Zugriff auf die Absettings. Hier nun der Code.

public abstract class ApplicationSettings
{
    private static ApplicationSettings instance;
    private static object instanceLock = new object();

    private string identifier;
    
    protected static ApplicationSettings Instance
    {
        get
        {
            return instance;
        }
    }
    
    protected static void Initialize<T>(string identifier) 
                      where T : ApplicationSettings
    {
        if (instance == null)
        {
            lock (instanceLock)
            {
                if (instance == null)
                {
                    instance = (ApplicationSettings) 
                                Activator.CreateInstance(typeof (T));
                    instance.identifier = identifier;
                }
            }
        } 
    }

    private object GetSettingValue(string settingsKey, object defaultValue)
    {
        NameValueCollection settings = ConfigurationManager.AppSettings;

        if (SettingsPrefix.Length > 0)
        {
            settingsKey = string.Format("{0}.{1}", SettingsPrefix, settingsKey);
        }

        string keyName = string.Format("{0}.{1}", settingsKey, identifier);

        if (settings[keyName] != null)
        {
            return settings[keyName];
        }
        else if (settings[settingsKey] != null)
        {
            return settings[settingsKey];
        }
        else
        {
            return defaultValue;
        }
    }

    protected virtual string SettingsPrefix
    {
        get { return string.Empty; }
    }

    public T Get<T>(string settingsKey, T defaultValue)
    {
        return (T)Convert.ChangeType(GetSettingValue(settingsKey, 
                                             defaultValue), 
                                     typeof(T), 
                                     CultureInfo.InvariantCulture);
    }
}

Visual Studio 2005 Service Pack in die Installationsdateien integrieren

Die Installation des Service Packs für Visual Studio 2005 dauert lange, sehr lange, desweiteren wird viel freier Speicher auf der Festplatte gebraucht und zwar schlappe 6,2 GB. Sollte man das Visual Studio mehrmals auf der Platte haben so erhöhrt sich der Speicherbedarf.

Wenn man den gerade nicht auf der benötigten Partition hat muss man sich was einfallen lassen (Paritionsgrößen anpassen oder gar Neuinstallation). Oder im Falle einer Neuinstallation des Visual Studios muss das Service Pack auch wieder drüber installiert werden, dies macht nicht unbedingt freude.

Doch es ist möglich das Service Pack in die Installationdateien zu integrieren und sich eine neue DVD daraus zu machen. Somit wären zukünftige Installationen des Visual Studios schneller erledigt und ein Update auf das Service Pack auch möglich wo die 6 GB freier Platz fehlen (dazu einfach das ohne Service Pack deinstallieren und das mit neu Installieren). Heath Stewart beschreibt die notwendigen Schritte in einem Blogeintrag, im Prinzip wird dazu nur das genutzt was der Windows Installer von Hause aus dafür bietet.

Slipstreaming Visual Studio 2005 Service Pack 1

Technorati Tags: ,

Web Deployment Project und das VS 2005 Service Pack

Nutzt man dass Web Deployment Project so mag man sich wundern das es nicht im Service Pack 1 des Visual Studio 2005 enthalten ist. Also beginnt die Suche nach dem Download, die "alten" Links stimmen nicht mehr und ein auffinden in den Microsoft Seiten auch nicht unbedingt einfach. Deshalb hier der aktuelle Download Link.

Technorati Tags: ,

Microsoft ASP.NET AJAX 1.0 RC ist da.

Heute hat Microsoft den Release Candidate des ASP.NET AJAX Framework veröffentlicht und geht somit in strammen Schritten auf die RTM Version zu. Download des Release Candidate Auch ist eine neuen Version des AjaxToolkits und der AJAX Futurures verfügbar die kompatibel zur RC Version sind. Wechselt man zum RC so sind die alten Versionen erstmal zu deinstallieren.

Auch sind Sachen in der Web.config anzupassen da sich einige Namespaces und Assemblies geändert haben. Genaueres findet sich im Migrationsleitfaden.

Ich denke mal Scott Guthrie wird bald weiterführende Info in kompakter Form rausgeben da dass lesen des Whitepapers keinen Spass macht.

Update Diese sind nun verfügbar.

Visual Studio 2005 Service Pack 1 ist verfügbar

Microsoft hat wohl wieder Release-Tag ;)

Das lang erwartete Visual Studio 2500 Service Pack 1 ist verfügbar, auch für die deutsche Version.

Download SP1 für Visual Studio 2005 Standard, Visual Studio Professional, Visual Studio Team Edition

Download SP1 für Version Express Editions

 Achtung: Leider hat Visual Studio 2005 einige Probleme unter Vista, diese sind mit diesem Service Pack 1 nicht behoben (jedenfalls nicht alle). Dafür wird es im 1. Quartal 2007 ein gesondertes Update geben.

Technorati Tags: ,

ReSharper 2.5 fertig und zum Sonderpreis

Heute hat JetBrains die Version 2.5 von ReSharper fertiggestellt. Ich selbst bin vor kurzen im Rahmen einer Verlosung bei http://www.bonn-to-code.net zu einer Lizenz von ReSharper gekommen. Vorher hatte ich es mal gestestet und als langsam und Resourcenfressend eingeschätzt, auch gab es ein paar Sachen die nicht so wie gewohnt zu nutzen waren. Aber sah schon einen nutzen drin, nur war er mir halt den Preis noch nicht wert und die Optik passte nicht. Mit der Lizenz ist der Tasche habe ich es doch benutzt und schätzen gelernt.

Heute ärgere ich mich das ich das Geld nicht doch ausgegeben habe. Obwohl es langsam und Resourcenfressend war. Doch mit der Version 2.5 hat sich einiges geändert. Es ist schneller installiert, schneller in der Anwendung, schneller gestartet (ok, erst beim zweiten Mal) und noch besser bei der Unterstützung beim schreiben von Code. Dazu sieht es noch schick aus.

Wer also mit einer älteren Version mal getestet hatte, der sollte vielleicht noch einen Blick darauf werfen und den 30 Tage Test wagen. Die Eingabeunterstützung, die Fehlerprüfung, die Templates, die Quicktipps und das Refactoring sind das Geld schon wert.

Apropo Geld, bis zum 11. Januar 2007 gibt es ReSharper zum Sonderpreis von 99€. Ich kann es nur empfehlen.

Update: Bestelllink für die $99 Dollar Version


ReSharper 2.5 neue Funktionen

ReSharper 2.5 alle Funktionen

ReSharper 2.5 Download

Technorati Tags:

MbUnit 2.3 ist fertig

Gestern ist das Unit Testing Framework MbUnit[1] in der Version 2.3 veröffentlicht worden. MbUnit ist gegenüber NUnit relativ einfach erweiterbar z.B. mit eigenen Testszenarien und TestAttributen. Auch bietet es von Hause schon ein paar nette Erweiterungen z.B. den RowTest womit man mit weniger Code mehr Testfälle ausführen kann. Andrew Stopford schreibt zur Veröffentlichung noch was in seinem [url=http://weblogs.asp.net/astopford/archive/2006/12/07/mbunit-2-3-rtm.aspx]Blog[/url]. Passend dazu empfehle ich TestDriven.NET [2] als Visual Studio Integration für verschiedene Unit Testing Frameworks.
[1] [url]http://www.mbunit.com[/url] [2] [url]http://www.testdriven.net[/url]

Welt-Aids-Tag

Welt-Aids-Tag

Welt-Aids-Tag-Role Schleif