2009-03-21 9 views
4

저는 서버와 클라이언트가있는 WCF 응용 프로그램에서 작업하고 있습니다 (당연히). 서버 프로젝트에서 나는 계약 속성으로 클래스를 정의했습니다.WCF : 클라이언트와 서버에서 계약 클래스를 어떻게 유지해야합니까?

이제 서버가 준비되면 서비스 참조를 추가하고 나를 위해 프록시를 만들었습니다. 나는 그것을 사용하고 그것은 잘 작동하지 않았다.

계약 속성이있는 클래스 정의가 들어있는 공통 DLL을 만들고이를 Visual Studio에서 클라이언트 용으로 생성 된 클래스를 사용하는 대신 서버와 클라이언트 모두에 사용하면 괜찮습니까? . 공통 클래스를 사용하는 경우 자동 코드 생성 중에 제네릭 컬렉션이 배열로 변환되는 것에 대해 걱정할 필요가 없습니다. 어리석은가요? 가능한가? 아무도 전에 이것을 해본 적이 있습니까? 이것을 할 수 있습니까?

배포 시나리오는 보안 인트라넷에 클라이언트의 수가 제한되어 있고 서버에 변경 사항이있을 때마다 기존 클라이언트를 업데이트하는 것이 좋습니다.

답변

2

당신이 클라이언트를 제어하는 ​​한 그 접근 방식은 괜찮습니다. (상당히 사용합니다) . 자바 클라이언트 등에서는 (명백하게) 작동하지 않을 것입니다. 만약 당신이 비 - 닷넷 클라이언트를 지원할 필요가 없다는 것을 안다면, 그것은 강력 할 수 있지만, 순수 SOA 규칙을 어기 게됩니다. 특히 네, 인트라넷 시나리오는이 접근법을 고려할 수있는 시나리오입니다.

svcutil.exe와 IDE 모두 기존 어셈블리의 유형을 정확하게 다시 사용할 수있는 옵션이 있습니다. 등의 예를 IDataErrorInfo에 대한

2

유일한 관심사는 필요하지 않을 경우 컬렉션으로 전환 - 당신이 두 번 코딩하지 않고, 클라이언트에서 동일한 유효성 검사 논리를 사용하려는 경우

편집이 방법의 또 다른 장점은 배열, 당신은 이것까지 갈 필요가 없습니다. 서비스 참조 추가 대화 상자의 고급 버튼을 사용하면 이와 같은 경우에 사용할 유형을 지정할 수 있습니다. T [] 대신 List를 사용할 수 있습니다.

+0

그 뿐만이 아닙니다. 이 클래스에 변경이있을 때마다 서비스 참조를 업데이트합니다. 또한 IDE에서 코드를 적게 생성하면 더 편하게 사용할 수 있습니다. 나는이 접근법을 따르는 경우, 표준/지침에 대해 금기 사항이나 끔찍한 일을하지 않을 것이라고 확신하고 싶었다. – Hemant

+0

변경 사항을 적용 할 때마다 서비스 참조를 업데이트 할 필요가 없습니다. 계약을 변경할 때만 가능합니다. 당신이 그렇게 자주하지 않기를 바랍니다. 서비스 팩토리 (http://www.codeplex.com/servicefactory) 사용을 고려해 볼 수도 있습니다. 클라이언트와 서비스를 함께 업데이트합니다. –

2

계약 유형을 별도의 공통 어셈블리로 유지하는 것이 좋습니다. 예를 들어 계약 유형과 가질 수있는 기타 비즈니스 오브젝트 또는 해당 유형 간의 중개자 등을 변환하기 위해 Adapters을 추가 할 수있는 기회를 제공합니다.

모든 클라이언트를 제어하지 않아도 일반 유형 을 사용하는 것이 좋습니다. .NET을 사용하는 내부 앱과 파트너 회사의 신뢰할 수있는 제 3 자에 의해 소비되는 서비스가 있다고 가정합니다. 파트너 앱은 Java, Ruby 또는 Python을 사용합니다. 이 경우 파트너는 공유 유형에 액세스 할 수 없지만 WSD/XSD를 사용하면 자체 클라이언트 유형 라이브러리를 사용할 수 있습니다. 그건 당신이 사내 개발자에게 좋은 유형의 공유 패키지를 제공하는 것을 배제해서는 안됩니다.

공유 유형에 대한이 권장 사항은 WS/SOAP과 달리 REST 인터페이스를 사용하는 경우에도 적용됩니다. REST를 사용하면 WSDL이 부족하지만 서버와 클라이언트가 교환하는 메시지의 유형을 설명하는 데 XSD (또는 유사한)가 계속 사용됩니다. 따라서 SOAP 또는 REST 사용 여부에 관계없이 조언을 변경할 필요가 없습니다.

편집 : 그리고 .NET 또는 Java 또는 다른 용도로 사용됩니다. 철사의 양쪽 끝을 제어하고 플랫폼이 같으면 유형을 공유해야합니다. 왜 안 그래?

1

계약서를 보유하기 위해 별도의 어셈블리를 만든 후에는 이러한 어셈블리를 참조하고이를 사용하여 클라이언트의 서비스에 채널 (ChannelFactory 사용)을 생성 할 수 있습니다. 이렇게하면 더 이상 서비스 계약을 변경할 때마다 '서비스 참조'를 업데이트 할 필요가 없습니다.

ChannelFactory<IContract> factory = 
    new ChannelFactory<IContract>("endpointName"); 
관련 문제