2

考虑以下情况:

我有多个接口,例如,,IService1......所有接口都由一个类实现 - 。IService2IService3MainService

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

这些通道基本上是我可以调用函数的代理。但是这些代理是特定于接口的。channel1不会调用任何其他方法,除了在IService1.

我需要的是一个超级代理,它可以调用任何接口中定义的任何方法IService1IService2等等IService3

有任何想法吗?

编辑:让一个接口继承所有其他接口是不可能的。让我们假设已经开发了服务,我所能做的就是修补服务主机和通道的创建。

4

1 回答 1

2

注意此解决方案不适用于 OP(原始海报),但我会将其留在这里,以供将来可能正在研究如何在实施新服务时执行此操作的读者使用。

我能想到的唯一方法是创建一个继承其他接口的新接口,如下所示:

public interface IMasterService : IService1, IService2, IService3
{

}

然后你可以IMasterService在你的服务中实现并且只需要一个端点:

public class MainService : IMasterService
{

}

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

现在您有了一个IMasterService可以使用的接口 ( ) ChannelFactory<T>

ChannelFactory<ServiceLibrary.IMasterService> channelFactory = new ChannelFactory<IMasterService>(binding, address);
IMasterService channel1 = channelFactory.CreateChannel();
于 2013-06-30T06:26:25.383 回答