2009-05-12 5 views
2

과거에 프로젝트의 프레임 워크를 만들었던 이유 중 하나는 데이터베이스 정보를 비즈니스 엔티티 클래스 (속성이없는 속성 만)로로드하고 비즈니스 엔티티 클래스에서 데이터베이스는 실행될 저장 프로 시저의 매개 변수 컬렉션을로드합니다. 이 프로젝트에서 나는 DB Filed info와 SP Parameters를 가진 Business Entity Class를 아래 샘플과 같이 꾸며서 프레임 워크가 리플렉션을 사용하여 엔티티 또는 매개 변수 컬렉션을로드하게하여 유지 보수를위한 새로운 코드를 생성 할 필요가 없었습니다.
하지만 지금은 훨씬 더 큰 새 프로젝트를 만들고 있습니다. 유지 보수 할 코드가 훨씬 많지만 성능이 중요하고 모든로드에 리플렉션을 사용하는 것이 가치가 있는지 궁금해하고 코드를 훨씬 간단하게 만들거나 실제로 모든 코드를 작성하고 모든 변경 사항을 유지 하시겠습니까?
MSDN에서 일부 검색을 읽었지만 MSDN의 설명서를 읽었지만 여전히 많은 의견을 보았습니다. 오버 헤드가 그렇게 좋지 않은 숫자를 나타내는 리플렉션을 선호하는 사람들과 리플렉션에서 멀리 떨어져있게하는 것이 실제로 더 바람직하다고 말하는 사람들 새로운 응용 프로그램에 대한

기술 사양 :
언어 : C#
닷넷 버전 : 3.5
응용 프로그램 종류 : 또한 C#으로 논리 구성 요소 및 데이터 액세스 계층에 접근 클래식 웹 양식
데이터베이스 : SQL 서버 2008
데이터베이스 추상화 계층 : DB에 대한 모든 액세스는 저장 프로 시저 및 사용자 정의 함수를 통해 이루어집니다. .


샘플 코드 :
데이터 액세스 레이어에 대한 반사 성능

// 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); 

답변

4

오히려 기본적으로 자신의 ORM 무엇 압연보다, 나는 그런 NHibernate 또는 Entity Framework으로 설립으로 ORMs 중 하나로 전환에게 추천 할 것입니다.

질문에 직접 답하기 위해 반사 성능이 그렇게 나쁘지는 않지만 개인적으로는 큰 프로젝트에서 자신을 굴린 ORM을 생각하지 않습니다.

1

개인적으로 데이터 액세스 요구 사항이 많은 트랜잭션 (트랜잭션 성이 높은 시스템)을 요구하는 경우 개인적으로 Reflection을 사용하지 않습니다. 융통성을 확보하면 궁극적으로 런타임에 비용이 발생합니다 (more comment on reflection here).

사용자 지정 솔루션을 고려하여 popular ORM solution을 선택합니다. 주로 동일한 접근 방식을 사용하는 더 큰 규모의 커뮤니티 (디자인 조언을 받고, 알려진 성능 튜닝을 디버깅하고 디버그하는 것이 더 쉽습니다.) 혜택을 누릴 수 있습니다.

또한 일반적으로 릴리스 된 최신 기술 (예 : SQL Server 2008)을 지원하는 업데이트에 액세스 할 수 있습니다. 즉, 부담이나 테스트 비용 (직선 구현 이외)을 사용하지 않아도됩니다.

엔티티 프레임 워크와 LINQ to SQL (.Net 3.5 및 모두 Stored Procs 지원)을 포함하는 number of popular solutions이 있지만 CodeSmith 템플릿/Net Tier를 사용하거나 더 복잡한 템플릿 중심 접근 방식에 대한 많은 지원도 있습니다 예를 들어 Hibernate 또는 Deklarit을 사용하는 솔루션.

필자가 설명한 것과 거의 같은 방식으로 필자가 사용했던 저장 프로 시저 및 함수와 관련된 마지막 큰 솔루션이지만 Enterprise 라이브러리를 사용하고 수기 도구를 사용하여 DAL 액세스 클래스와 데이터 전송 개체를 생성했습니다. MS Patterns and Practices 'Web Service Software Factory'에서 사용 된 것과 동일한 접근 방식을 사용하거나 잠재적으로 템플릿 중심 접근 방식을 사용할 수 있습니다.

관련 문제