В прошлом я создал каркас для проекта, в котором одной из его функций была загрузка информации о базе данных в классы моих бизнес-сущностей (только свойства без методов) и из классов бизнес-сущностей в базу данных, загружающую коллекцию параметров хранимая процедура, которая будет выполнена. Для этого в этом проекте я украсил классы бизнес-сущностей информацией Filed DB и SP-параметрами, как показано в примере ниже, и позволил платформе загрузить сущность или коллекцию Parameters, используя отражение, поэтому мне не пришлось генерировать новый код для обслуживания.
Но сейчас я создаю новый и гораздо больший проект, конечно же, гораздо больше кода для поддержки, но там, где производительность критична, и мне было интересно, стоит ли использовать отражение для всей нагрузки и сохранить код намного проще или фактически сгенерировать весь код и сохранить все изменения?
Я провел некоторый поиск, прочитал некоторые документы по MSDN, но все же нашел много разных мнений, люди, которым понравилось размышление, показывающее цифры, что накладные расходы не так уж плохи, а другие говорили, что на самом деле лучше держаться подальше от размышлений.
Технические характеристики нового приложения:
Язык: C #
Версия .Net: 3.5
Тип приложения: классические веб-формы, обращающиеся к компонентам логики и уровню доступа к данным, также в C #
База данных: SQL Server 2008
Уровень абстракции базы данных. Весь доступ к БД осуществляется с помощью хранимых процедур и пользовательских функций.
Пример кода:
// 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);