2008-10-21 5 views
1

시나리오 :C# Generics/Design Patterns : 템플릿 메서드를 사용해야합니까?

나는 공통점을 가지고있는 개체 집합을 노출 3 개 가지 웹 서비스를 (사람이 대답 한 경우/내 질문에 최근에 다소 익숙 할 것을 볼 때). 필자는 중간 메서드와 서비스 개체를 변경하기 위해 일반 메서드를 사용하여 래퍼 클래스와 변환 논리를 작성했습니다.

웹 서비스를위한 인터페이스가 있는데이 질문의 목적을 위해 IService라고 부릅니다. 3 가지 구현 클래스 인 Service1Impl, Service2Impl 및 Service3Impl이 있습니다. 이들 각각은 다른 웹 서비스를 참조하고 적절한 객체간에 변환하기 위해 위에서 언급 한 일반적인 메소드를 사용합니다.

_service = ServiceWrapper.GetServiceWrapper("2"); 

나에게로 인스턴스화 ServiceWrapper을 줄 것이다 :

은 공장이 ISerivice

등의 같은 적절한 구현을 만드는 데 사용됩니다 (생성자를 통해 런타임에 내 ServiceWrapper 클래스에 주입 Service2Impl.

(젠장 다이어그램은 화끈 도움이 될 것입니다!)의 각 구현 그래서

확인

public IProperty[] GetProperties(string item, IProperty[] properties) 
{ 
    Property[] props = ServiceObjectFactory.CreateProperties<Property>(properties); 
    Property[] result = _service.GetProperties(item, props); 
    return ServiceObjectFactory.CreateProperties(result); 
} 

이 (내가 이름을 리팩토링 할 것 같네요) 조금 혼란 보이는 : IService 인수 술 .. GetProperties를 요구하는 방법이있다.

는 기본적으로 무슨 일이 일어나고있는 것입니다 : (당신이 매개 변수에서 볼 수 있듯이)

  1. ServiceWrapper에서이 함수의 호출은 중간 오브젝트 (IProperty)로 이루어진다.

  2. 중간 개체는 서비스마다 고유 한 속성 개체로 변환됩니다.

  3. 결과가 서비스 별 속성 개체로 돌아옵니다.

  4. 결과는 ServiceWrapper에 다시 전달되기 전에 중간 개체로 변환됩니다.

이제이 코드는 Service1Impl, Service2Impl 및 Service3Impl에 대해 정확히 동일합니다. 물론 사용 된 유형이 다른 것을 제외하고는.

누구나 동일한 코드를 3 번 ​​가지고 있지 않도록이 작업을 수행 할 수있는 방법을 생각할 수 있습니까?

N.B : 이것은 각 구현의 모든 메소드에 해당하지 않습니다. 그냥 그들 대부분.

답변

1

여러분의 코드에 다른 유형의 시그니처가 있기를 원한다면 코드를 세 번 다른 코드로 작성해야한다고 생각합니다. 유형이 다르므로 "동일한 코드"가 아닙니다.

당신이 갖고있는 것을 상속 된 메서드에 넣은 다음 각 하위 클래스에 결과를 래핑 할 수 있습니다.

+0

그건 내가 생각하기에. 감사. –

0

귀하의 시나리오에 맞는지 궁금한 점이 있으시면 Inversion of Control을 염두에 두시기 바랍니다.

관련 문제