我过去为一个项目创建了一个框架,它的功能之一是将数据库信息加载到我的业务实体类中(只有属性,没有方法),并从业务实体类到数据库加载参数集合要执行的存储过程。为此,在该项目中,我使用 DB 归档信息和 SP 参数(如下面的示例)装饰业务实体类,并让框架使用反射加载实体或参数集合,这样我就不必生成新的维护代码。
但现在我正在创建一个新的、更大的项目,当然需要维护更多的代码,但是性能至关重要,并且想知道是否值得对所有负载使用反射并保持代码更简单,或者实际上生成所有代码和保留所有更改吗?
我做了一些搜索,阅读了 MSDN 上的一些文档,但仍然发现了很多不同的意见,喜欢反射的人显示数字开销并没有那么糟糕,而其他人则说实际上最好远离反射
新应用程序的技术规范:
语言:C#
.Net版本:3.5
应用程序类型:访问逻辑组件和数据访问层的经典 Web 表单也在 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);
最佳答案
我建议切换到已建立的 ORM 之一,例如 NHibernate,而不是滚动基本上是您自己的 ORM。或Entity Framework .
直接回答你的问题,反射性能并没有那么糟糕,但我个人从来没有想过使用我自己在大型项目中使用的 ORM。
关于c# - 数据访问层的反射性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/852387/