Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据访问层的反射性能_C#_Performance_Reflection_.net 3.5 - Fatal编程技术网

C# 数据访问层的反射性能

C# 数据访问层的反射性能,c#,performance,reflection,.net-3.5,C#,Performance,Reflection,.net 3.5,我曾经为一个项目创建过一个框架,它的功能之一是将数据库信息加载到我的业务实体类(只有属性,没有方法)中,并从业务实体类加载到数据库,加载要执行的存储过程的参数集合。为此,在该项目中,我使用DB FIELD info和SP参数(如下面的示例)装饰业务实体类,并让框架使用反射加载实体或参数集合,这样我就不必为维护生成新代码。 但是现在我正在创建一个新的更大的项目,当然要维护更多的代码,但是性能是至关重要的,我想知道是否值得对所有负载使用反射并使代码更简单,或者实际生成所有代码并维护所有更改? 我做了

我曾经为一个项目创建过一个框架,它的功能之一是将数据库信息加载到我的业务实体类(只有属性,没有方法)中,并从业务实体类加载到数据库,加载要执行的存储过程的参数集合。为此,在该项目中,我使用DB FIELD info和SP参数(如下面的示例)装饰业务实体类,并让框架使用反射加载实体或参数集合,这样我就不必为维护生成新代码。
但是现在我正在创建一个新的更大的项目,当然要维护更多的代码,但是性能是至关重要的,我想知道是否值得对所有负载使用反射并使代码更简单,或者实际生成所有代码并维护所有更改?
我做了一些搜索,阅读了一些MSDN上的文档,但仍然发现了很多不同的观点,喜欢反射的人表示开销并没有那么大,还有人说实际上最好远离反射

新应用程序的技术规格:
语言:C#
.Net版本:3.5
应用程序类型:C#
中访问逻辑组件和数据访问层的经典Web表单 数据库: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,我建议您切换到一种已建立的ORM,例如or


直接回答您的问题,反射性能并没有那么差,但我个人从未想过在大型项目中使用我自己开发的ORM。

我个人认为,如果数据访问需求需要大量事务(高度事务性的系统),我不会使用反射-您从灵活性中获得的最终成本是运行时(更多)

我会根据自定义解决方案选择一个。主要是,您将受益于使用相同方法的更大社区(更容易获得设计建议、调试以及利用已知的性能调整)

它通常还意味着在发布时可以访问支持更新技术(如SQL Server 2008)的更新—您不必穿上这种罩袍,也不必支付测试成本(直接实现除外)

有包括实体框架和LINQ到SQL(在.Net 3.5中,两者都支持存储过程)的方法,但也有大量支持使用CodeSmith模板/Net层的模板驱动方法,或使用NHibernate或Deklarit的更复杂的解决方案

我所涉及的上一个大型解决方案使用的存储过程和函数与您描述的方式基本相同,但是我们使用企业库,并使用手写工具生成DAL访问类和数据传输对象。您可以使用与MS模式和实践“”中使用的方法大致相同的方法,或者任何模板驱动的方法