Ich hatte in der Vergangenheit ein Framework für ein Projekt erstellt, dessen eine Funktion darin bestand, die Datenbankinformationen in meine Business-Entitätsklassen (nur Eigenschaften keine Methoden) und von den Business-Entitätsklassen in die Datenbank zu laden Datenbank lädt die Parametersammlung der gespeicherten Prozedur, die ausgeführt werden soll. In diesem Projekt habe ich die Business Entity Classes mit den DB Filed Informationen und den SP Parametern wie im folgenden Beispiel dekoriert und das Framework die Entity oder die Parameters Collection mittels Reflection laden lassen, so dass ich keinen neuen Code für die Maintenance generieren musste.
Aber jetzt erstelle ich ein neues und viel größeres Projekt, natürlich viel mehr Code zu pflegen, aber wo Leistung ist kritisch und fragte mich, ob es sich lohnt, Reflexion für die gesamte Last und hielt den Code viel einfacher oder tatsächlich generieren alle Code und behalten Sie alle Änderungen bei?
Ich hatte einige suchen, lesen Sie einige der Dokumentation auf MSDN, aber immer noch viele verschiedene Meinungen gefunden, Leute, die Reflexion mit Zahlen, dass der Overhead nicht so schlecht ist, und andere sagen, dass es besser ist, sich von Reflexion zu vermeiden
Technische Spezifikationen für die neue App:
Sprache: C#
.Net Version: 3.5
Typ Anwendung: Klassische Web Forms Logik-Komponenten und Data Access Tier auch in C#
Datenbank Zugriff auf SQL Server 2008
Datenbankabstraktionsschicht: Der gesamte Zugriff auf die Datenbank erfolgt über Stored Procedures und User Defined Functions .
Beispielcode:
Reflektionsleistung für Datenzugriffsschicht
// Decorated class
[System.Serializable()]
public class bMyBusinessEntity{
private Int64 _MyEntityID;
private string _MyEntityName;
private string _MyEntityDescription;
[aFieldDataSource(DataColumn = "MyEntityID")]
[aRequiredField(ErrorMessage = "The field My Entity ID is mandatory!")]
[aFieldSPParameter(ParameterName="MyEntityID")]
public Int64 MyEntityID{
get { return _MyEntityID; }
set { _MyEntityID = value; }
}
[aFieldDataSource(DataColumn = "MyEntityName")]
[aFieldSPParameter(ParameterName = "MyEntityName")]
public string MyEntityName{
get { return _MyEntityName; }
set { _MyEntityName = value; }
}
[aFieldDataSource(DataColumn = "MyEntityDescription")]
[aFieldSPParameter(ParameterName = "MyEntityDescription")]
public string MyEntityDescription{
get { return _MyEntityDescription; }
set { _MyEntityDescription = value; }
}
}
// To Load from DB to the Object:
using (DataTable dtblMyEntities = objDataSource.ExecuteProcedure(strSPName, objParams)) {
if (dtblMyEntities.Rows.Count > 0) {
DataRow drw = dtblMyEntities.Rows[0];
oFieldDataSource.LoadInfo(ref objMyEntity, drw);
return objMyEntity;
}
else
throw new Exception(“Row not found!”);
}
// To Load from the Object to the DB
oDataSource objDataSource = new oDataSource();
IDbDataParameter[] objParams = objDataSource.GetProcedureParameters(strSPName);
oFieldSPParameter.LoadInfo(objParams, objMyEntity);
objDataSource.ExecuteNonQuery(strSPName, objParams);