2011-09-04 4 views
3

WCF 초급 질문 : 나는 WCF 계약을 변경하는 것이 비용이 많이 들고 지속적인 유지 관리 (클라이언트 측에서 프록시 재 작성)가 필요하다고 말했으므로 선호되는 방법은 매우 일반적인 point-of-contact 메서드 (주어진 enum 매개 변수에 따라 행동하는 방법 결정).WCF 단일 연락 지점

이것은 나에게 상당히 냄새가 들지만이 문제에 대한 정보는 찾을 수 없었습니다 (아마도 검색 키워드가 잘못 선택되었을 가능성이 있습니다). 조언이나 유용한 링크가 있습니까?

감사합니다.

답변

3

프록시를 다시 생성 할 필요는 없으며 클라이언트가 올바른 인터페이스 버전으로 빌드되었는지 간단히 확인할 수 있습니다. 당신이 매우 조심스럽고 메소드 만 추가하고 제거하거나 수정하지 않는다면 잘 작동합니다. 물론 그것은 관리해야 할 많은 책임입니다.

얼마 전에에서 내 질문을 확인, 인터페이스를 사용하기보다는 클라이언트 프록시를 생성하려면 :이 서비스 계약 (인터페이스)를 수정하는 것 또한 다시 클라이언트가 필요한 것이 사실이다

WCF Service Reference generates its own contract interface, won't reuse mine

+0

+1 : 계약을 확장해도 이전 버전과의 호환성이 깨지지 않습니다. 클라이언트가 계약에서 새 메소드를 사용하지 않는 경우 프록시를 재생성 할 필요가 없습니다. –

0

을 새로운 게시 된 WSDL을 사용하여 프록시 클래스를 끝내고 클라이언트가 새 프록시와 동일한 코드를 변경해야 할 수도 있습니다. 계약서의 모든 변경 사항을 처리 할 수있는 일반적인 인터페이스를 만들 수 있다고는 생각하지 않습니다. 계약은 자주 변경되지 않도록 계약서를 매우 신중하게 작성해야하며 계약을 변경해야하는 경우 이전 버전의 클라이언트가 이전 버전과 계속 작동 할 수 있도록 다른 버전의 서비스를 배포하는 것이 좋습니다 .

1

어떤 변화가 있었는지에 따라 다릅니다. 서비스 계약 변경은 비용이 많이 들고 발생하지 않아야합니다. 서비스 계약은 변경이 매우 드물지만 충분히 높은 수준의 세분화가 필요합니다.

서비스에서 공개되는 유형이보다 일반적입니다. 이러한 변경 사항이 더 일반적이므로 가능한 경우 기존 클라이언트를 손상시키지 않도록 변경 사항에 접근해야합니다.

인터페이스를 사용하여 유형을 다형성으로 표시하는 등 여러 가지 방법이 있지만 가장 간단한 방법은 새 데이터 멤버 필드를 추가하고 유형을 변경하지 않고 새 필드를 필수가 아닌 것으로 만드는 것입니다 . 이러한 변경 사항을 제한 할 수 있으면 기존 클라이언트에 미치는 영향이 가장 적으며 새 클라이언트가 새 필드를 사용할 수 있습니다.

희망이 도움이됩니다.

3

여기에 몇 가지 용어가 혼란스럽고 .Net 3.5 SP1에서 수정 된 알려진 결함을 언급 한 것 같습니다.

런타임시 값 비싼 작업이었던 WCF 프록시를 다시 만드는 작업이있었습니다. 이것은 .Net 3.5에서 프록시 객체를 투명하게 캐시하기 위해 개선되었습니다 MSDN Blog.

프록시의 "코드 유지 관리"를 말하는 경우에는 클라이언트에서 인터페이스를 구현하는 것이 전부입니다. 인터페이스를 유지해야하는 경우 기본 SOA로 돌아갑니다. 서비스가 액세스 및 가능한 한 많은 정보를 제공하는 경우, 사용자의 서비스가 아직 고려되지 않은 목적으로 사용된다고 가정하면 인터페이스를 작성한 후에 인터페이스를 수정할 필요가 없을 것입니다. 또한 업그레이드 경로도 고려해야합니다.

Juval Lowy는 자신의 저서에서이 문제에 대해 좋은 토론을하고 있습니다.이 책은 약간 고밀도이지만 약간의 좋은 정보가 있습니다.

조언 : WCF는 코드를 매우 간단하고 우아하게 만들 수있는 많은 기능을 제공합니다. 유지 관리가 걱정되면 인터페이스를 작성하십시오.

string ServiceMethod(string xml) //returns XML 

이렇게하지 마십시오. 좋은 유지 보수가 가능한 인터페이스와 좋은 데이터/메시지 계약을 설계 할 시간을 가지십시오. 그러면 WCF는 상호 작용을 위해 서비스를 호스팅 할 때 무료로 얻을 수있는 모든 추가 기능을 제공합니다.

+1

+1 "Do not do this"... –

2

일반 (비 특정, 모 놀리 식) 인터페이스는 이해하기 어렵고 프로그래밍하기가 어렵습니다. 단일 메소드를 API로 정의하지 않는 이유는 클라이언트가 진행 상황을 이해하는 것이 불가능하기 때문이며,이 인터페이스의 (암시 적) API를 변경하면 클라이언트는 사용자가 감지하지 못하는 끔찍한 방식으로 중단됩니다 컴파일 시간.

WCF를 만난 지 꽤 오래되었지만 클라이언트가 동일한 코드베이스, 버전 관리 및 배포 체계 인 경우 WCF 프록시를 다시 생성하는 것은 매우 쉽고 "강력한"상세한 API를 사용하면 삶을 살아 가게됩니다. 일반적인 것보다 훨씬 쉽습니다.