2014-04-16 5 views
-1

각 개체의 ID, 이름 및 TypeCode가 다른 몇 가지 차이점이있는 동일한 속성을 가진 3 개의 개체가 있습니다. 데이터베이스에는 ID, Name 및 TypeCode 필드가 포함 된 첫 번째 테이블이 있으며 각 개체의 해당 속성을 각각 포함하는 세 개의 다른 테이블이 있습니다.팩토리 패턴을 빌드하는 일반적인 방법

표 1 : Id | 이름 | 유형 코드

표 2 : Id | FunctionName

표 3 : Id | 분석 명

표 4 : Id | PropertyName

우리는 TypeCode에 따라 개체의 속성을 반환하는 "GetProperties"라는 storedProcdure가 있습니다. "GetProperties"는 객체 ID 인 하나의 인수를 취합니다. 우리는 저장 프로 시저를 호출하기 전에 TypeCode를 모른다.

의 TypeCode 함수에는 다음 필드가 반환되는 경우 :

ID, 이름, TypeCode의 :의 TypeCode이 분석에는 다음 필드가 반환되는 경우,

ID, 이름,하는 TypeCode를 FUNCTIONNAME

, AnalysisName 내가 4 개 클래스 만든

등 ... : FunctionObject, AnalysisObject 및 PropertyObj을 MyObject 클래스에서 상속받은 요법.

public T GetObject<T>(string storedProcedure, List<DataBaseParameteres> parameters) where T: new() 
{ 
    T result = new T(); 
    OpenConnection(); 
    SqlDataReader reader = ExecuteSqlCommand(storedProcedure, parameters); 
    PropertyInfo[] properties = typeOf(T).GetProperties(); 

    if(reader.Read()) 
    { 
     for(int i = 0; i<properties.Count(); i++) 
     { 
      object value = Convert.ChangeType(reader[properties[i].Name], properties[i].PropertyType); 
      properties[i].SetValues(result, value, null); 
     } 
    } 
    reader.Close(); 
    CloseConnection(); 
    return result; 
} 

이 기능은 내가 다음과 같이 호출 할 수 있습니다, 잘 작동하고 생성 된 개체를 반환합니다 :

MyObject obj1 = GetObject<MyObject>(obj1Id); 

public class MyObject 
{ 
    public decimal Id; 
    public string Name; 
    public string TypeCode; 
} 

public class FunctionObject: MyObject 
{ 
    public string FunctionName; 
} 

public class AnalysisObject: MyObject 
{ 
    public string AnalysisName; 
} 

public class PropertyObject: MyObject 
{ 
    public string PropertyName; 
} 

나는 나 동적 객체를 만들 수있는 일반적인 기능을 만들었습니다

내 문제는 이제 일반 개체 메서드 "GetObject"를 수정하여 FunctionObject, AnalysisObject 및 Propertyobject를 수정하는 방법을 알고 싶습니다. 함수를 호출 할 때 내가하는 TypeCode에 대해 어떤 생각을 가지고 있지 않기 때문에 내가하는 TypeCode하지 않는 한 나는이 작업을 수행 할 수 없습니다 : 나는 당신의 시나리오에 따라, 생각하지 말아

FunctionObject obj2 = GetObject<FunctionObject>(obj2Id); 
+1

반드시 Entity Framework를 살펴 봐야합니다. –

+0

많은 선택지가 없다. 구멍 프로젝트를 수정할 수 없다. 엔티티 프레임 워크를 추가 할 수 없다. 단지 논문 클래스를 수정해야한다. – user3540496

답변

0

을, 개체를 만들 수 있습니다 이러한 유형의. 그 이유는 저장 프로 시저에 대한 호출과 동일한 메서드에서 개체 생성을 호출하여 혼합했기 때문입니다.

내 제안은 저장 프로 시저에 대한 호출을 해당 메서드에서 다른 메서드로 제거하고 저장 프로 시저를 데이터 테이블로 실행 한 다음 해당 데이터 테이블을이 메서드로 전달하는 것입니다. 이 방법으로 귀하는 TypeCode을 미리 가지고 있어야하며, 공장 패턴을 사용하여 필요한 유형의 객체를 생성 할 수 있습니다.

또한 이러한 방식으로 리플렉션에 대한 의존성을 줄일 수 있으므로 코드 성능이 약간 향상 될 수 있습니다.

희망이 도움이됩니다.

+0

응답을 주셔서 감사합니다. 일반 패턴을 사용하여 공장 패턴을 만들 수있는 방법은 없습니다. 행동 양식? – user3540496

+0

주어진 메서드를 사용하는 IMO는 팩터 리 패턴에서 관련 객체를 만들기 위해 스위치 나 if 문이 필요하기 때문에 가능하지 않습니다. "FunctionObject"등에서 if 문을 만드는 조건은 메서드 내에 있습니다. 해당 메서드에서 SP 호출을 제거하고 먼저 호출 한 다음이 메서드를 호출해야합니다. 어쩌면 오버로드를 생성하여이 방법을 사용하는 다른 코드가 깨지지 않도록 – samar

+0

도움을 주셔서 감사합니다. SqlDataReader 필드를 사용하여 개체 속성을 매핑 할 수있는 다른 함수를 만들었습니다.이 함수를 호출하기 전에 TypeCode를 확인한 다음 적절한 개체 유형을 사용하여이 함수를 호출합니다. – user3540496