문제

이 질문은 특히 대상이되는 질문보다 사람들이 지역 사회에서 무엇을하고 있는지 발견하려는 조사에 가깝습니다. 나는 이것에 대해 꽤 광범위하게 검색했으며, 계약 우선 서비스 디자인을 옹호하는 많은 블로거들과 그것들을 뒷받침하는 의견을 찾았지만, WCF와의 계약 우선, 장단점을 구현하는 것에 대한 실용적인 정보를 아직 찾지 못했습니다. 실제 환경 등에서 그렇게하는 것. 나는 최근에 Thomas Erl의 책을 통해 SOA에 대한 광범위한 연구를 해왔으며, 그가 옹호하는 주요 개념 중 하나는 계약 우선 디자인입니다.

내 질문은 다음과 같습니다.

  1. .NET 및 WCF로 계약 우선 서비스 설계에 어떻게 접근합니까?
  2. Svcutil 외에 계약에서 고객과 서비스를 모두 생성 할 수있는 다른 도구가 있습니까? (VS와 통합되는 모든 것이 이상적입니다)
  3. 계약 우선 디자인과 WCF로 어떤 실제 전문가를 만났습니까?
  4. 계약 우선 디자인과 WCF로 어떤 실제 단점이 있습니까?

계약 우선 개발의 주요 문제 중 하나는 툴링 인 것 같습니다. Svcutil은 계약에서 서비스 코드를 생성 할 수있는 유일한 것입니다. 단일 파일, 속성과 코드 생성 아티팩트로 가득 찬 멍청이, 기본적으로 계약이 업데이트 될 때마다 재생 및 교체해야합니다. 나는 더 나은 접근 방식, 바람직하게는 재생을 필요로하지 않는 것을 선호합니다. 실제 시나리오에서 실용적이라고 가정하면 서비스 측 계약을 수동으로 만들어도 괜찮습니다.

편집하다:

WCSF가 내 즉각적인 요구를 해결하는 동안 배우는 동안 프로토콜 버퍼 그리고 서비스 공장 앞으로 저를 도울 것이라고 확신하는 흥미로운 도구입니다.

도움이 되었습니까?

해결책

WSCF VS 통합과 함께 계약 우선 도구를 제공합니다. 확인 해봐. (무료)

7 월 6 일 현재 설정 프로그램이 포함 된 바이너리 릴리스가 있습니다.

다른 팁

계약 우선 접근 방식을 사용합니다. 일반적으로 각 끝에서 동일한 유형 표현을 사용하여 항상 (항상 아는 것은 아닙니다).

실제로 WCF를 사용하려면 특별한 프록시 등이 필요하지 않습니다. 양쪽 끝에서 일반 .NET 유형을 사용할 수 있으며 사용하지 않습니다. svcutil.exe 조금도. 작업 서비스를 얻는 것은 구성 파일에 "ABC"를 추가하고 다음과 같은 것을 사용하는 것만 큼 간단합니다.

public sealed class WcfClient<T> : System.ServiceModel.ClientBase<T>
    where T : class
{
    public T Service { get { return base.Channel; } }
}

이제 사용할 수 있습니다.

using(var client = new WcfClient<IMyService>()) {
    int i = client.Service.SomeMethod("abc");
}

그리고 당신이 고객 (및 서버)에있는 것은 당신의 것입니다. IMyService 상호 작용.


다른 도구의 경우; Protobuf -Net은 Google의 "프로토콜 버퍼"API를 구현 한 것으로, "Contract First"(및 휴대용/상호 운용 가능한) 방식 (예 : (a .proto 파일)에 데이터 및 서비스를 설명하기위한 DSL을 갖는 DSL을 구현합니다.

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}
message SearchResponse {
  repeated string result = 1; 
}
service SearchService {
  rpc Search (SearchRequest) returns (SearchResponse);
}

Protobuf-Net 도구 (내가 유지 관리하는)에는이 DSL을 C#/VB로 변환하기위한 "프로토 겐"유틸리티가 포함되어 있습니다. 그리고 옵션 중 하나 (C#의 경우, 적어도 VB를 확인해야 함)는 전체 WCF 프록시 구현 (동기화 또는 비동기 메소드 선택)을 방출하는 것입니다. svcutil과 매우 유사하지만 (protobuf -net 관계로 인해) 관습이 포함됩니다. [ProtoBehavior] 운영 계약의 속성은 Protobuf-Net Serializer를 사용하여 대신 DataContractSerializer (더 빠르고 효율적이지만 다릅니다).

대 통합의 경우; 나는 정확히 그 일을하고있다 (증거).

나는 계약 우선 개발을 선호합니다. 나는 그것을 사용했다 서비스 공장 이 목적을 위해. 이를 통해 사용자 정의없이 서비스와 클라이언트 코드를 모두 생성 할 수있었습니다.

와 함께 사용자 정의에서, 우리는 또한 엔티티 프레임 워크 개체에 해당하는 데이터 전송 객체를 생성 할 수 있었고 코드는 코드에서 다른 코드로 변환 할 수있었습니다. 예외의 자동 로깅; 및 서비스의 HTML 문서화.

이는 서비스 팩토리와 함께 제공되는 코드 분석 규칙에 추가하여, 호환되지 않는 WCF 옵션을 선택함으로써 개발자가 발에 촬영하는 것을 방지하는 데 도움이됩니다.

WCF에서는 '계약 우선'의 모습에 약간의 다양성이 있습니다. 데이터 및 서비스 계약이 올바른 속성 마크 업이있는 .NET 유형으로 표현되는 '코드 계약 우선'을 수행 할 수 있습니다. WSDL로 시작하여 서비스 및 데이터 계약을 생성하거나 데이터 계약을 위해 XML 스키마로 시작하여 서비스 계약을 코드로 표현할 수 있습니다. 당신이가는 방법은 실제로 계약의 특성과 그것이 어떻게 사용되는지에 달려 있습니다.

WSDL 사양에 무언가를 구현하는 경우 WSDL의 코드 gen은 명백한 선택이며 손으로 생성하는 것이 그리 큰 문제가 아닙니다. WSDL 파일을 변경하여 즉시 전파하려면 프로젝트 빌드 이벤트에서 생성을 트리거 할 수 있습니다.

데이터 계약으로 사용하려는 기존 스키마 (XSD)가 있거나 다른 플랫폼에서 더 쉽게 재사용 할 수 있도록 데이터 계약을 개발하는 것을 선호하는 경우 xsd.exe (또는 3 번째)를 사용하여 스키마에서 유형을 생성 할 수 있습니다. 파티 대안). 이 경우 코드 지향 서비스 계약에서 XML-Serializable 유형을 사용합니다. 이것: .

.NET에서 클라이언트와 서버를 직접 개발하고있는 경우 고객이 계약 조립품을 얻거나 서비스 메타 데이터 (예 : WSDL)에서 클라이언트를 생성하는 것이 행복 할 수있는 경우 코드에서 계약을 모델링하는 것은 훌륭한 경험입니다. "알려진 유형"체계를 사용하면 데이터 계약에서 상속 모델을 지원할 수 있습니다. 이는 매우 강력 할 수 있습니다. 고객의 계약 조립을 직접 참조하여 고객 코드 생성을 완전히 건너 뛸 수 있습니다. 매우 생산적이고 우아하지만 너무 화려하게되면 인터 로프 도전을 만들 수 있다는 것을 알고 있어야합니다.

우리가하는 방식은이 비디오에 설명되어 있습니다.

http://www.dnrtv.com/default.aspx?hownum=103

아이디어는 코드 생성을 사용하지 않으므로 계약이 변경 될 때 코드를 재생할 필요가 없습니다.

계약은 코드에 있으며 클라이언트와 서버간에 불일치가 있으면 빌드 오류로 표시됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top