2012-06-05 3 views
0

응답 및 요청을 처리하는 코드를 작성합니다. 둘 다 XML 형식 일 수 있으며 둘 다 변환 및 직렬화를 통해 만들어진 C# Object 형식 일 수 있습니다. (.NET 2.0)T와 하위 클래스를 기반으로 유형을 결정하는 더 좋은 방법

응답 및 요청은 더 큰 메시지 유형의 기본 구현입니다. 지금 GetEligibility와 FindCandidates가 있습니다. 나는이 과정을 단순화하기 위해 제네릭을 사용하기로 결정했습니다 내 매핑 기능을 복제 할 수 없습니다 때문에

public partial class GetEligibilityResponseMessage : ResponseMessage 

public partial class ResponseMessage : Message 

, 그것은 밖으로 좋은 일하고있어 다음 Model.MessageModel 클래스의

예는 아래의 사용 :

는 기본 클래스 코드

내 코드가 처음이라고
public virtual Model.MessageModel.Message MapToModel<T>(XmlDocument xml) 
    { 
     V3Mapper mapper = new V3Mapper(); 
     Model.MessageModel.Message message = mapper.MapToDomainModel<T>(xml, Environment) as Model.MessageModel.Message; 
     return message; 
    } 

    public virtual XmlDocument MapToXml<T>(Model.MessageModel.Message message) 
    { 
     V3Mapper mapper = new V3Mapper(); 
     XmlDocument xml= mapper.MapToV3Message<T>(message, Environment); 
     return xml; 
    } 

은, 그것은 XML의 documen있다 티. 이 문서가 요청으로 매핑된다는 것을 알고 있으므로 오버 라이딩되는 가상 메소드를 호출합니다. (그리고 나는 추악하다고 생각합니다.) 기본에 매핑 코드를 유지하는 이유는 코드를 복제하지 않는 것입니다,하지만 난 내가 다음으로 피하고 싶은 정확한 것은 일을 오전 찾을 :

GetEligibility : BaseClass로

public override Model.MessageModel.Message MapToModel<T>(XmlDocument xml) 
    { 
     if(typeof(T).IsAssignableFrom(typeof(GetEligibilityResponseMessage))) 
     { 
      return base.MapToModel<GetEligibilityResponseMessage>(xml); 
     } 
     else if (typeof(T).IsAssignableFrom(typeof(GetEligibilityRequestMessage))) 
     { 
      return base.MapToModel<GetEligibilityRequestMessage>(xml); 
     } 
     return null;//because this is a quick code snippet 
    } 

인가를 이 일을하는 더 우아한 방법이 있습니까? 나는 항상 내가 응답이나 요청으로 일하고 있는지 알고있다. 기능을 열어 두어 너무 단단히 결합시키지 않고 동시에 기능적으로 빠르도록하고 싶습니다.

이것은 여러 가지 메시지 유형으로 구현 될 예정이며, 실제로는 복사/붙여 넣기 스타일이 싫어서 우아한 해결책이 될 것입니다.하지만 확실한지 모르겠습니다. (.NET 2.0)

+0

제 조언은하지 마십시오. 그러면 혼란스러운 코드로 이어질 것입니다. –

+0

똑같은 2 가지 기능을 10 가지 클래스로 복사/붙여 넣는 것과는 반대로? 내 차도 아니야. 나는 마지막 코드 블록의 팬이 아니기 때문에 그것에 대해 묻는 이유가있다. –

+0

'GetEligibilityResponseMessage'와'GetEligibilityRequestMessage'에서 파생 된 클래스가 없다면, 재정의 된'MapToModel'은 기본 클래스와 동일하다. 타입 검사의 예외. 그렇다면'MapToModel' 메쏘드를 오버라이드하는 것은 무엇입니까? 타입 검사를 위해서인가? –

답변

3

일반 메서드를 호출하기 전에 형식을 확인하지 않아도되도록 MethodInfo.MakeGenericMethod Method을 사용할 수 있습니다. 내가 대해서 typeof (날짜 시간)을 사용하지만 경우에 당신이 대해서 typeof (T)에 의해 원하는 느슨하게 결합 된 솔루션을 달성하는 것을 대체 할 수

class Program 
{ 
    public static void Generic<T>(T toDisplay) 
    { 
     Console.WriteLine("\r\nHere it is: {0}", toDisplay); 
    } 

    static void Main(string[] args) 
    { 
     MethodInfo mi = typeof(Program).GetMethod("Generic"); 
     MethodInfo miConstructed = mi.MakeGenericMethod(typeof(DateTime)); 

     DateTime now = DateTime.Now; 
     miConstructed.Invoke(null, new object[] { now }); 
    } 
} 

주의 사항 : 다음은 간단한 사용 예이다. 전용 MapToRequestMapToResponse와 함께, 당신도 한 단계 더 가서 BaseClass 제네릭 할 수

public class BaseClass 
{ 
    private readonly Type _requestType; 
    private readonly Type _responseType; 

    protected BaseClass(Type requestType, Type responseType) 
    { 
     _requestType = requestType; 
     _responseType = responseType; 
    } 

    public T MapToModel<T>(XmlDocument xml) 
    { 
     if (typeof(T) != _requestType && typeof(T) != _responseType) 
      throw new InvalidOperationException("Invalid type"); 

     var mapper = new V3Mapper(); 
     return mapper.MapToDomainModel<T>(xml, Environment); 
    } 
} 

public GetEligibility : BaseClass 
{ 
    public GetEligibility() 
     : base(typeof(GetEligibilityRequestMessage), typeof(GetEligibilityResponseMessage)) 
    {} 
} 

: 당신은 그냥 요청 및 응답 유형을 확인하려면

0

, 당신은 당신의 기본 클래스는 그것에 대해 알 수 있습니다 반환 할 항목을 알고있는 메소드 :

public class BaseClass<TRequest, TResponse> 
    where TRequest:RequestMessage, 
      TResponse:ResponseMessage 
{ 
    public TRequest MapToRequest(XmlDocument xml) 
    { return MapToModel<TRequest>(xml); } 

    public TResponse MapToResponse(XmlDocument xml) 
    { return MapToModel<TResponse>(xml); } 

    private T MapToModel<T>(XmlDocument xml) 
    { 
     var mapper = new V3Mapper(); 
     return mapper.MapToDomainModel<T>(xml, Environment);   
    } 
} 

public GetEligibility : BaseClass<GetEligibilityRequestMessage, GetEligibilityResponseMessage> 
{} 
관련 문제