2011-12-13 7 views
2

현재 여러 개의 다른 클라이언트 응용 프로그램에서 사용되는 하나의 서비스 계약 인터페이스 (이하 "SCI")로 구성된 대형 WCF 서비스를 리팩토링하고 있습니다. 나는 SCI를 분할하여 각 유형의 클라이언트 애플리케이션에 대해 필요한 작업에 특정한 SCI를 제공한다. SCI의 일부 공유 섹션은 클라이언트 응용 프로그램 특정 SCI가 상속하는 기본 SCI에 정의됩니다.WCF 서비스에서 사용할 수있는 서비스 계약 인터페이스 중 하나만 클라이언트를 생성하십시오.

모든 클라이언트 관련 SCI를 구현하는 단일 서비스 클래스가 있습니다. 공유베이스 SCI로부터 다이아몬드 인터페이스 상속 상황이 있다는 사실은 때로는 여러 SCI를 통해 동일한 작업이 가능하다는 것을 의미합니다. 클라이언트를 자동 생성 할 때 (특히 비동기 클라이언트 메소드를 사용하는 경우) 결과 코드에 많은 추악한 <generated-type>1,2,3이 있습니다.

이 문제를 피하기 위해 각 클라이언트 응용 프로그램에만 서비스 참조를 추가하고 싶습니다 특정 응용 프로그램과 관련된 SCI에 대한 클라이언트를 생성합니다. 다른 SCI에 나타나는 동일한 기능으로 인해 아무런 문제가 발생하지 않아야합니다.

이것이 가능합니까?

이 상황에서 모듈성과 코드 재사용을 달성하는 데 도움이되는 정보는 모두 인정할 것입니다.

답변

1

서비스 계약 인터페이스를 만들려면 수동으로 수행하거나 원래 서비스 구현에서 가져 오거나 자동으로 생성 한 다음 복사하십시오.

다음 서비스 참조를 사용하는 대신 채널 팩터 리를 사용하여 서비스에 바인딩하십시오 (아래 참조). 이것은 WCF 서비스를 참조하는 좋은 방법입니다.

는이 작업을 수행하기 위해 다음과 같은 심판이 필요합니다

using System.ServiceModel; 
using System.ServiceModel.Description; 

그런 다음 다음을 사용할 수 있습니다 시도 할

 var binding = new WebHttpBinding(); 
    var factory = new ChannelFactory<IMyServiceContract>(binding, new EndpointAddress("http://url:port")); 
    factory.Endpoint.Behaviors.Add(new WebHttpBehavior()); 

    var myService = factory.CreateChannel(); 

    myService.ServiceMethod(); 
+0

이렇게하면 서비스에 채널을 사용하는 클라이언트를 구현할 수 있습니까? 자동 생성 된 비동기 작업과 함께 자동 생성 클라이언트 유형을 가져올 수 있습니까? – EdF

+0

ASYNC 버전의 WCF 서비스를 꾸미면이 작업을 수행 할 수 있습니다.이 문서를 참조하십시오. http://msdn.microsoft.com/en-us/library/bb885132.aspx IE : [OperationContract (AsyncPattern = true) ] IAsyncResult BeginDivide (double n1, double n2, AsyncCallback 콜백, 객체 상태); double EndDivide (IAsyncResult ar); 비동기 메서드를 제공합니다. –

+1

비동기 작업을 수동으로 수행하는 방법을 보여줍니다. 그러나 코드 생성기가 작업을 수행 할 때 수십 가지 작업을 수행하는 것은보기 흉한 것처럼 보입니다. 특정 서비스 계약에 대한 코드 생성에 대해 알고 싶습니다. – EdF

0

루크의 제안 가치. 'ChannelFactory'방법은 자동 생성 방식에 많은 이점을 가지고 있습니다. SCI의 주석을 유지할 수 있으며 SCI 변경 후 참조를 업데이트 할 필요가 없습니다.

프로덕션 환경에서는 성능을 위해 싱글 톤 (singleton) chache를 수행하고 서비스 구현을 위해 SCI를 분리해야하므로 클라이언트와 서비스 구현 모두에서 SCI를 참조 할 수 있습니다.

'async'에 대해 언급했는데, 이것은 Binding 또는 Behavior 구성 사용 일 수 있습니다.

private ChannelFactory CreateFactoryInstance<T>(string endpointConfigurationName, string endpointAddress) 
{ 
    ChannelFactory factory = null; 
    factory = new ChannelFactory<T>(endpointConfigurationName, new EndpointAddress(endpointAddress)); 
    factory.Open(); 
    return factory; 
} 
+0

추측 내가 내일 일할 때 채널 공장 접근 방식을 시도해 볼 것입니다. 둘 다 추천하기 때문입니다. – EdF