如何让WCF生成实际对象的列表或IEnumerable
代理?我是在自托管应用程序中这样做的。
这就是我所拥有的:
public interface IRemoteControlGroup {
List<IRemoteControl> GetInstances();
}
public class RemoteControlGroupImpl : IRemoteControlGroup {
public List<IRemoteControl> GetInstances()
{
System.Console.Error.WriteLine("Called GetInstances()");
List<IRemoteControl> list = new List<IRemoteControl>();
// implementation detail: get this list of IRemoteControl objects
return list;
}
}
public interface IRemoteControl {
void Stop();
void Start();
void GetPID();
}
public class RemoteControlImpl : IRemoteControl {
// actual implementation
}
我希望WCF:
RemoteControlGroupImpl
上的合同定义的服务IRemoteControlGroup
。List<IRemoteControl>
时(在客户端上)给我一个IRemoteControlGroup.GetInstances()
,其中列表的元素是实现IRemoteControl
的代理(通过调用主机的实际IRemoteControl
对象)。我不希望WCF通过网络推送实际的RemoteControlImpl
个对象;我只是希望它推动实现IRemoteControl
的代理。 RemoteControlImpl
个对象实际上包含本地系统的句柄(Window句柄,因为我们的应用程序只显示GUI界面),因此不可序列化。 GetInstance()
返回的元素数量可能会有所不同。
我找到this article,这听起来像我想要的。的种类。但它并没有告诉我如何在代码中执行此操作;只是在配置中。它也没有完全描述我想要的东西。该服务的入口点提供代理服务;但我希望我的服务的入口点能够提供代理列表。
答案 0 :(得分:0)
@John Saunders指出你需要重新思考你的方法。我可以考虑一些可能有用的一般方法,具体取决于驱动“多个”实例的内容。
1)如果它们是从应用程序外部驱动的(即可用的IRemoteControl目标列表在运行时不会动态更改),那么您可以通过多个端点公开相同的合同。例如。 http://localhost/remotecontrol.svc/instance1,http://localhost/remotecontrol.svc/instance2等。可以通过WSDL公布不同端点的可用性。
2)如果多个目标是动态的,那么最简单的方法是重新定义合同:
public interface IRemoteControlGroup {
List<string> GetInstances();
void Stop(string instanceId);
void Start(string instanceId);
void GetPID(string instanceId);
}
在内部,您的服务将维护一个可用的IRemoteControl对象字典,由InstanceId键入,并简单地将传入操作路由到目标实例。