2010-06-25 4 views
36

내 첫 번째 질문은 그래서 적합 희망을 재사용하지 않습니다 그것 IDocRepository. [ServiceContract]으로 표시되며 여러 개의 [OperationContract] 표시 방법이 있습니다.WCF 서비스 참조가 자신의 계약 인터페이스를 생성, 나의

WCF 구현 어셈블리 - 각각 WCF 서비스로 해당 인터페이스를 구현하는 공유 어셈블리를 참조하는 두 개의 WCF 서비스 프로젝트가 있습니다.

소비자 조립 - 마지막으로 두 개의 WCF 서비스 각각에 대한 참조와 함께 공유 어셈블리를 참조하는 '클라이언트'프로젝트가 있습니다.

public partial class ExampleClient : System.ServiceModel.ClientBase<SomeNamespace.ExampleSvcRef.IDocRepository>, SomeNamespace.ExampleSvcRef.IDocRepository { 

내가
내가 모두 참조 대신 자동으로 상속 것이라고 기대했을 것으로 예상 무엇 : 그러나

는 소비자 어셈블리에서 생성 된 서비스 참조는 인터페이스의 자동 생성 된 버전에서 파생 내가 정의한 인터페이스, 소비자/클라이언트 어셈블리도 참조하고 있습니다. 클래스의 재사용이 매개 변수 및 반환 유형을 제공하지만 서비스 인터페이스의 경우와 비슷합니다.


서비스 참조 프록시 인스턴스를 만들어 인터페이스 유형으로 캐스팅 할 수 있습니다.

그래서 생성 된 코드를 매번 손으로 수정할 수 있지만 더 나은 방법이 있어야합니다 ...?

(편집 : 나는 두 서비스 참조를 선택한 옵션 '참조 된 모든 어셈블리 재사용 유형' '참조 된 어셈블리에서 재사용 유형'과이 있습니까)

답변

44

"참조 된 어셈블리의 재사용 유형"에서는 서비스 계약이 아닌 데이터 계약 만 재사용 할 수 있습니다. 서비스 계약을 공유하려면 "서비스 참조 추가"를 사용할 필요가 없습니다. ChannelFactory을 직접 사용해도됩니다.

// Supply the binding and address in code 
Binding binding = new BasicHttpBinding(); 
EndpointAddress address = new EndpointAddress("http://tempuri.org/address"); 
IServiceContract channel = ChannelFactory<IServiceContract>.CreateChannel(binding, address); 

// Or read them from the config file 
ChannelFactory<IServiceContract> channelFactory = new ChannelFactory<IServiceContract>(); 
IServiceContract channel = channelFactory.CreateChannel(); 

채널 객체가 ICommunicationObject을 구현하는 것입니다, 그래서 당신은 (오픈() 또는 닫기와 같은 메소드를 호출해야하는 경우가 캐스팅 수 있습니다.)

+1

위대한 솔루션, 감사합니다 –

+0

두 번째 옵션을 사용하려고했지만 EndpointAddress가 지정되어야한다는 오류가 발생합니다. 설정 파일에서 같은 계약 (인터페이스)을 지정하여 엔드 포인트를 설정했지만 거기에 보이지 않는 것입니까? 도울 수 있니? –

+2

Nevermind; 엔드 포인트 구성 이름을 ChannelFactory <> 생성자에 전달해야합니다. –

4

이 서비스의 참조를 생성, 상자가 당신이 할 수있다 공유 정의를 다시 사용하도록 틱하십시오. 클라이언트 프로젝트가 이미 공유 어셈블리를 참조하고 서비스 참조를 다시 추가하고 모든 옵션을 신중하게 확인하십시오.

그래도 작동하지 않으면 사용중인 바인딩을 확인하십시오. 기본 HTTP 바인딩이 유형 재사용을 지원하지 않는다는 모호한 기억이 있습니까?

+0

안녕하세요, David, 댓글 주셔서 감사합니다! - 나는 정확하게 말했어 야 했어. :) '참조 된 어셈블리의 재사용 유형'을 확인한 후 'References types in References types'를 시도해 보았습니다. 그리고 'References types in specified referenced assemblies'를 사용하여 수동으로 어셈블리를 선택했습니다. 위와 같이). –

+0

동일한 공유 라이브러리를 사용하여 2 개의 서비스를 참조하려는 경우 해당 경로의 문제 만 있습니다. 당신은 중복 된 객체들을 얻는다. – eschneider

+0

@eschneider - 그게 어떻게 보이는지 모르겠다. 'Reuse ...'옵션은 기존의 참조 된 클래스를 사용하여 클래스 ('객체')의 복제를 중지한다. 그렇지 않습니까? 그러나 나는 내 질문에 설명 된 문제가 중복 된 인터페이스를보고있다 :). –

2

당신이 어느 정도 유용한 제한-하지만-기능의 중 ... 프록시 생성기를 사용하는 부분 클래스를 계속 사용하려면 또 다른 좋은 옵션이 있습니다 : 프록시가 있는지 확인

namespace <same namespace as generated proxy> 
{ 
    public partial class MyClient : <namespace of "real" service contract>.IServiceContract 
    { 
    } 
} 

을 서비스 계약이 정의하는 것과 동일한 방식으로 코드를 생성합니다. 즉, '목록'을 사용하는 경우 서비스 참조 구성에서도 해당 옵션을 사용하십시오.즉, 생성 된 서비스 인터페이스가 실제 서비스 인터페이스와 정확히 일치하는지 확인하고 위의 코드가 작동하고 코드를 작성하는 대신 마우스 오른쪽 버튼을 눌러 참조를 업데이트하십시오.

+0

해킹과 같은 느낌이지만 작동합니다! –

2

Visual Studio에서는 프록시 클래스 생성시 기존 인터페이스를 다시 사용할 수 없습니다. Quartermeister가 지적한대로 재사용 유형은 계약 인터페이스를 재사용하지 않습니다.

우리는 상속으로 해결했습니다. Jester Software가 제안한 위의 부분 클래스 아이디어와 매우 유사합니다. 당신이했던 것처럼 단지 서비스 참조를 만들 클라이언트의 프로젝트에서

:

이것은 우리가 그것을 해결하는 방법입니다.

internal class MyServiceProxy : MyServiceClient, MyLogicNamespace.IMyService 
{} 

이 클래스는 생성 MyServiceClient에서 상속하지만 클라이언트가 원래의 인터페이스를 구현한다는 것을 말한다 : 그런 다음 클라이언트의 대체 역할을하는 클래스를 추가 할 수 있습니다.

MyServiceClient 클래스는 원래 인터페이스와 일치하지 않는 방법이 포함 된 경우 다음 프록시에 추가 할 수 있습니다

과의 변환을 (난 당신이 "ServiceProxies"라는 이름의 폴더에 넣어 제안) 암호.

그런 다음 MyServiceClient를 사용했던 곳의 MyServiceProxy 만 사용하십시오.

관련 문제