c# - 数据访问层的反射性能

标签 c# performance reflection .net-3.5

我过去为一个项目创建了一个框架,它的功能之一是将数据库信息加载到我的业务实体类中(只有属性,没有方法),并从业务实体类到数据库加载参数集合要执行的存储过程。为此,在该项目中,我使用 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/

相关文章:

php - Elasticsearch PHP 批量索引性能与索引

c# - 扩展方法应该有前缀吗?

c# - 避免 Windows 窗体中的闪烁?

performance - 了解 postgres 中的 virtualxid 事务类型

r - 当已知可能的输出时加速 `strsplit`

C# GetMethod 与 GetRuntimeMethod

c# - 按字节加载程序集会丢失位置

java - 如何在Java中动态实例化和调用类成员的方法?

c# - .NET Web API - 添加日志记录

c# - 删除文档类型的正则表达式