2013-06-30 3 views
2

다음 상황을 고려하십시오.클래스가 여러 인터페이스를 구현하는 WCF 서비스

예를 들어, IService1, IService2, IService3 ... 모든 인터페이스는 단일 클래스 (MainService)로 구현됩니다.

NetTcpBinding binding = new NetTcpBinding(SecurityMode.None, reliableSessionEnabled: true); 
string address1 = "net.tcp://localhost:9000/ep1"; 
// create other addresses with ep2, ep3 and so on... 

ServiceHost serviceHost = new ServiceHost(typeof(ServiceLibrary.MainService)); 
serviceHost.AddServiceEndpoint(typeof(IService1), binding, address1); 
serviceHost.AddServiceEndpoint(typeof(IService2), binding, address2); 
serviceHost.AddServiceEndpoint(typeof(IService3), binding, address3); 
// and so on... 

serviceHost.Open(); 
Console.WriteLine("Running..."); 
Console.ReadLine(); 

이 시점에서이 서비스 호스트 인스턴스에 대해 여러 끝점이 있습니다. 클라이언트 인스턴스를 만들려면 다음을 수행하십시오. -

NetTcpBinding binding = new NetTcpBinding(SecurityMode.None, reliableSessionEnabled: true); 
string address = "net.tcp://...:9000/ep1"; 

ChannelFactory<ServiceLibrary.IService1> channelFactory = new ChannelFactory<IService1>(binding, address); 
IService1 channel1 = channelFactory.CreateChannel(); 
// create other channel factories and other channels and now we have channel1, channel2, channel3 

이 채널은 기본적으로 기능을 호출 할 수있는 프록시입니다. 그러나 이러한 프록시는 인터페이스마다 다릅니다. channel1IService1에 정의 된 메소드를 제외하고는 다른 메소드를 호출하지 않습니다.

내가 필요한 것은 IService1, IService2, IService3 등의 인터페이스에 정의 된 모든 메소드를 호출 할 수있는 슈퍼 프록시입니다.

아이디어가 있으십니까?

EDIT : 단일 인터페이스가 다른 모든 인터페이스를 상속받는 것은 불가능합니다. 서비스가 이미 개발되었다고 가정하고 내가 할 수있는 것은 서비스 호스트와 채널을 만드는 것입니다.

답변

0

참고이 솔루션은 OP (원래 포스터)에서는 작동하지 않지만 향후 새로운 서비스를 구현할 때이를 수행 할 방법을 모색 할 수있는 독자를 위해 남겨 두겠습니다.

public interface IMasterService : IService1, IService2, IService3 
{ 

} 

그런 다음 서비스에 IMasterService을 구현할 수 있으며, 단 하나의 엔드 포인트가 필요합니다 : 그 작업을 수행하는 생각할 수

유일한 방법은이 같은 다른 인터페이스를 상속 새로운 인터페이스를 만드는 것입니다 :

:

public class MainService : IMasterService 
{ 

} 

serviceHost.AddServiceEndpoint(typeof(IMasterService), binding, address1); 

지금 당신은 당신이 ChannelFactory<T>와 함께 사용할 수있는 단일 인터페이스 (IMasterService)가

+0

사실 내 생각에 그런 생각이 들었지 만 불행히도 그럴 수는 없습니다. – p0lAris

+0

그 이유는 할 수 없습니까? – Tim

+0

일부 서비스를 구현하는 이미 패키지 된 일부 DLL을 고려하십시오. 하지만 리플렉션을 동적으로 사용하여 이러한 모든 것을 상속받는 인터페이스를 만들면 가능합니다. – p0lAris

관련 문제