2010-02-23 5 views
5

세부 정보 개체를 가져 와서 유효성을 검사하고이를 요청으로 변환하고 큐에 넣는 다음과 같은 메서드가 있습니다. 내가 문제가있는 유효성 확인 요청을 제외하고는 모든 것이 잘됩니다. 기본적으로, 각 세부 오브젝트에 대해 다른 유효성 검증 논리가 있습니다. 나는 세부 객체가 BaseDetails의 기본 클래스를 가져야하고 실제 generic 매개 변수에서 파생 된 정확한 유형을 알고 있어야하지만,이 클래스를 사용하여 모든 유효성 검사기 클래스를 작성하는 방법을 모르기 때문에 모든 유형의 세부 사항을 처리한다는 일반 제약 조건을 알고 있습니다. :제네릭을 사용하는 초보자 다형성 질문

private void Enqueue<TDetails, TRequest>(TDetails details) 
    where TDetails: BaseDetails where TRequest: BaseRequest 
{ 
    bool isValid = _validator.Validate(details); 

    if (isValid) 
    { 
    TRequest request = ObjectMapper 
     .CreateMappedMessage<TDetails, TRequest>(details); 

    _queue.Enqueue(request); 
    } 
} 
+0

TDetails의 각 구현마다 다른 밸리데이션이 필요합니까? –

+0

예, 일부는 일반적이지만 TDetails마다 다른 추가 비트가 있습니다. –

답변

0

특정 구현의 유효성을 검사하는 방법을 알고있는 TDetails의 각 구현에 대한 유효성 검사기 클래스를 만든 다음 주어진 TDetails 구현에 맞는 유효성 검사기를 생성하고 _validator가 올바른 클래스를 가져올 수있는 팩토리를 가질 필요가 있다고 생각합니다. 공장에서 일을하고 수업을 통해 검증을 받으십시오.

분명히 기본 클래스에서 일반적인 유효성 검사를 수행 할 수 있습니다. 은 (가능한 경우 세부 사항에 연결해야하는 유효성 검사 논리 개체 자체 보인다 나를 위해

당신은 객체 자체하지만에 대한 검증을 가진 더 나은보다는 각 TDetails 구현을위한 별도의 유효성 검사기를 만들 수 있습니다 ...

+0

Re : 공장 - 이것이 어떻게 정의 될까요?각 유효성 검사기는 다른 형식을 취할 때와 다른 메서드 서명을 갖습니다. 그렇지 않으면 기본 클래스를 가져 와서 각 유효성 검사 메서드에서 파생 된 형식으로 형변환하도록 선언 할 것입니까? –

+0

팩토리는'IDetailsValidator GetValidator (TDetails)'메소드를 가지며'switch (typeof (TDetails)) '를 수행 한 다음 각각의 경우에 대해 해당 인터페이스의 구현을 리턴합니다. 이 인터페이스는'bool IsValid (TDetails)'메소드를 가질 것이다. 각 구현은 메서드에서 올바른 형식으로 캐스팅하고 유효성 검사를 수행합니다. –

+0

큰 스위치 (또는 다른 경우)에서 벗어날 수는 없으므로 새 유효성 검사기를 추가 할 수있는 단일 위치 (팩토리 클래스)에 배치하는 것이 좋습니다. 코드의 여러 위치에서 수표를 작성하지 않고 작성했습니다. –

2

그냥 유효성 검사기의 해당 계층 구조 자체 TDetails 개체에 연결된 각이 있어야합니다 것을 의미한다. TDetails은 항상 BaseDetails이므로 지원하는 자식 클래스를 직접 지정하고 중첩 된 유효성 검사기에 체인 실행을 지정해야합니다.

1

, 당연하지). 그런 다음 기본 클래스 추상을 표시하고 필요한 경우 특정 세부 클래스에 대해 Validate 메서드를 재정의 할 수 있습니다.

반면에 '상속을 통한 구성'은 현재 유행하고 있습니다.

+0

가장 쉬운 방법이지만 TDetails는 WCF 데이터 계약이며 나는 그들을 만질 수 없습니다! –

+0

그러면 TDetails마다 하나의 유효성 검사기가 붙어있는 것처럼 보입니다. 이제는 TDetails 구현을 제어 할 수 있기를 바랍니다. –

+0

@Stacey 그런 다음 필요한 유효성 검사기 (기본 또는 파생 된 세부 클래스 지정)를 전달하기 위해 종속성 주입 컨테이너를 사용합니다. 널리 수용되는 저장소 패턴과 유사합니다. –

1

나는 일반 제약 알고 세부 사항은 BaseDetails의 기본 클래스가 있어야 오브젝트 것을

이는 (내가 비주얼 스튜디오는 그것을 알고 의미)

바이트 코드로 컴파일 과정에서 알려져있다

나는 정확한 파생 형

을 알고 실제 일반적인 매개 변수의

그러나 이것은 단지 afte 알려져있다 r JIT 컴파일 (Visual Studio는 그것에 대해 아무것도 모릅니다). 늦은 구속력과 같습니다.

그래서 당신은 다른 인수의 형태로 여러 가지 방법으로 하나 개의 유효성 검사기 클래스를 작성하려면 비주얼 스튜디오 컴파일러는 느릅 나무 메소드가 호출 될 것이다 (컴파일시에) 알고하지 않았기 때문에, 당신은이 작업을 수행 할 수 없습니다.

나는 쓰기 '스위치 (대해서 typeof (TDetails))'검증이 TDetails에 의해 선택해야 로직을 생략 할 방법이 없다고 생각합니다. 따라서 샘 홀더 (Sam Holder)가 위에 쓴 것과 같은 일종의 공장을 만들어야합니다.

추신 : 내 영어로는 유감입니다. stackoverflow도 영어 공부를 위해 사용하고 있습니다 :)