Frage an die Generic-Cracks und DbCommand-Cracks bzw (SqlCommand, OleDbCommand, ODBCCommand und OracleCommand)

11/10/2007 - 21:36 von Oliver Denter | Report spam
Hallo,

ich brauche eine Klasse die sich wie DbCommand (und abgeleitete Klassen)
verhàlt mit ein paar Ausnahmen.

1.)
Ich will eine zusàtzliche Property einbauen (bool{soweit noch kein
Problem})

2.)
Ich will in iDbCommand.CommandText eine Prüfung einbauen, unter anderem
auf die Variable von 1 und auf this.CommandText.


Folgende Ideen hatte ich
1.)
Neue Klasse die von DbCommand erbt, dann musste ich jedoch feststellen
das ich alle Methoden neu implementieren muss.
Ausserdem musste ich einen enum bauen der mit den Typ der verwendeten DB
vorhàlt damit ich im Konstruktor in einem switch-Statement den
entsprechend korrekten Typ erzeugen kann.

Dann nach einiger Zeit vielen mir die Generics ein. Kurz einen kleinen
Test gemacht. Perfekt!
Eigentlich genau das was ich will.

Also eine neue Klasse erstellt
GenericCommand<T>
{
private T dbCommandValue;

public GenericCommand(T command)
{
}
}

Damit kann ich nun beim deklarieren der Klassen, sowie beim erzeugen den
genauen Typ angeben. Also zum Beispiel:
GenericCommand<SqlCommand> com = new GenericCommand<SqlCommand>();
oder
GenericCommand<OracleCommand> com = new GenericCommand<OracleCommand>();

Da ich ja nur eine Klasse um DbCommand herum baue ist mein Problem nun,
das ich eine Property Connection baue (wie DbCommand.Connection).
Kein Problem Code sieht so aus:
public IDbConnection Connection
{
get { return ((IDbCommand)dbCommandValue).Connection; }
set { ((IDbCommand)dbCommandValue).Connection = value; }
}
làsst sich auch wunderbar übersetzen.

Der Vorteil von Generics ist aber doch eigentlich das ich keine
Typenkonvertierungen durchführen brauch, weil beim übersetzen ja
feststeht welcher Typ es ist.

Meine Frage ist nun ist das Elegant was ich da mache? Weil ich fange
jetzt ja doch an zu casten, obwohl man das mit Generics ja eigentlich
verhindern will.
Und wenn es nicht elegant ist, welche anderen Möglichkeiten habe ich?

Mfg
OD
 

Lesen sie die antworten

#1 Philipp Brune
12/10/2007 - 10:31 | Warnen spam
Hallo Oliver,

im Prinzip finde ich Deine Idee Ok. Wenn Du die Deklaration etwas
anpasst, sparst Du Dir das casten noch :

GenericCommand<T>
where T: IDbCommand <= Constraint, dass T auf IDbCommand
beschrànkt, es geht auch DbCommand o.à.
{
private T dbCommandValue;

public GenericCommand(T command)
{
}
}


Vielleicht ist auch das Decorator Design Pattern was für Dich, siehe :
http://www.exciton.cs.rice.edu/Java...attern.htm

je nachdem ob Du Deinen GenericCommand<T> an den Stellen einsetzen
möchtest, wo sonst der normale DbCommand verwendet wird. Andernfalls,
also wenn Du nicht (von DbCommand erbst oder IDbCommand implementierst)
musst Du ja an jeder Stelle im Quellcode an der Du Deinen
GenericCommand<T> verwendest auch den T Typ kennen, denn sowas wie

public class A
{
}

public class B : A
{
}

public class Generic<T>
where T:A
{
}


Generic<B> gb = new Generic<B>();
Generic<A> ga = gb;

geht leider nicht.

Schöne Grüße,
Philipp

Oliver Denter schrieb:
Hallo,

ich brauche eine Klasse die sich wie DbCommand (und abgeleitete Klassen)
verhàlt mit ein paar Ausnahmen.

1.)
Ich will eine zusàtzliche Property einbauen (bool{soweit noch kein
Problem})

2.)
Ich will in iDbCommand.CommandText eine Prüfung einbauen, unter anderem
auf die Variable von 1 und auf this.CommandText.


Folgende Ideen hatte ich
1.)
Neue Klasse die von DbCommand erbt, dann musste ich jedoch feststellen
das ich alle Methoden neu implementieren muss.
Ausserdem musste ich einen enum bauen der mit den Typ der verwendeten DB
vorhàlt damit ich im Konstruktor in einem switch-Statement den
entsprechend korrekten Typ erzeugen kann.

Dann nach einiger Zeit vielen mir die Generics ein. Kurz einen kleinen
Test gemacht. Perfekt!
Eigentlich genau das was ich will.

Also eine neue Klasse erstellt
GenericCommand<T>
{
private T dbCommandValue;

public GenericCommand(T command)
{
}
}

Damit kann ich nun beim deklarieren der Klassen, sowie beim erzeugen den
genauen Typ angeben. Also zum Beispiel:
GenericCommand<SqlCommand> com = new GenericCommand<SqlCommand>();
oder
GenericCommand<OracleCommand> com = new GenericCommand<OracleCommand>();

Da ich ja nur eine Klasse um DbCommand herum baue ist mein Problem nun,
das ich eine Property Connection baue (wie DbCommand.Connection).
Kein Problem Code sieht so aus:
public IDbConnection Connection
{
get { return ((IDbCommand)dbCommandValue).Connection; }
set { ((IDbCommand)dbCommandValue).Connection = value; }
}
làsst sich auch wunderbar übersetzen.

Der Vorteil von Generics ist aber doch eigentlich das ich keine
Typenkonvertierungen durchführen brauch, weil beim übersetzen ja
feststeht welcher Typ es ist.

Meine Frage ist nun ist das Elegant was ich da mache? Weil ich fange
jetzt ja doch an zu casten, obwohl man das mit Generics ja eigentlich
verhindern will.
Und wenn es nicht elegant ist, welche anderen Möglichkeiten habe ich?

Mfg
OD

Ähnliche fragen