考虑以下情况:
我有多个接口,例如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
这些频道基本上是我可以调用函数的代理。但这些代理是特定于接口的。除channel1
中定义的方法外,IService1
不会调用任何其他方法。
我需要的是一个超级代理,它可以调用任何接口IService1
,IService2
,IService3
等中定义的任何方法。
有什么想法吗?
编辑:让单个接口继承所有其他接口是不可能的。让我们假设已经开发了服务,我所能做的就是修改服务主机和频道的创建。
答案 0 :(得分:1)
注意此解决方案不适用于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();