Der ConnectionString an der richtigen Stelle, statische Konstruktoren und statische Variablen

Written on April 15, 2004

Beim Stöbern in den Samples des User Interface Process Application Block ist mir ein Übel meiner bisherigen ASP.NET Applikationen wieder ins Bewusstsein gekommen: Der ConnectionString, gespeichert in der Web.config wird über mehrere Layer hinweg an den Data Access Application Block übergeben, welcher die DB-Funktionen bereithält.

Doch was hat der ConnectionString im Presentation Layer zu suchen? Absolut Nichts.

Deshalb war etwas Re-factoring angesagt: Der ConnectionString soll unabhängig von der Zielplattform (ASP.NET oder Winforms) direkt vom Data Access Layer (DAL) direkt aus der Konfiguration der Applikation gelesen werden. Dies stellt dank .NET kein großes Problem dar:

const string CONFIG_CONNECTION_STRING = "ConnectionString";
NameValueCollection values =
(NameValueCollection)ConfigurationSettings.GetConfig("appSettings");
string ConnectionString = values[CONFIG_CONNECTION_STRING];

Da ich allerdings generell mit dem Data Access Application Block arbeite und meine Methoden im DAL statisch ausführe, stellte sich für für das Problem, wie ich es vermeiden kann

a) den DAL per new instanzieren zu müssen und
b) nicht in jeder statischen Methode o.g. Code implementieren zu müssen.

Die Lösung liegt in statischen Variablen und Konstruktoren - ein Dank an Claudius Ceteras für diese Info!

Das Resultat sieht nun wie folgt aus:

public class OleDB // DAL Klasse
{
static string staticConnectionString; // Statische Variable

static OleDB() // Statischer Konstruktor
{
const string CONFIG_CONNECTION_STRING = "ConnectionString";
NameValueCollection values = (NameValueCollection)ConfigurationSettings.GetConfig("appSettings");
staticConnectionString= values[CONFIG_CONNECTION_STRING];
}

public static MyTypedDataSet MyStaticMethod(object Param) // Statische Methode
{
AdoHelper OleDbHelper =
AdoHelper.CreateHelper(typeof(OleDb).Assembly.FullName,typeof(OleDb).FullName);
MyTypedDataSet ds = new MyTypedDataSet();
OleDbHelper.FillDataset(
staticConnectionString,
CommandType.StoredProcedure,
"myStoredProcedure",
ds,
new string[]{"TypedDataTable"},
new OleDbParameter("@myParam", Param));
return ds;
}
}