2

如何让 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对象实际上包含本地系统的句柄(窗口句柄,因为我们的应用程序只公开一个 GUI 界面),因此不可序列化。返回的元素数量GetInstance()可能会有所不同。

我找到了这篇文章,这听起来像是我想要的。有点儿。但它并没有告诉我如何在代码中做到这一点;只是在配置中。它也不能完全描述我想要什么。服务的入口点提供代理;但我希望我的服务的入口点提供代理列表。

4

1 回答 1

0

正如@John Saunders 指出的那样,您需要重新考虑您的方法。我可以想到几种可能有用的通用方法,具体取决于驱动“多个”实例的原因。

1) 如果它们是从应用程序外部驱动的(即可用的 IRemoteControl 目标列表在运行时不会动态更改),那么您可以通过多个端点公开相同的合同。例如http://localhost/remotecontrol.svc/instance1http://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 为键,并简单地将传入操作路由到目标实例。

于 2012-02-20T22:55:22.230 回答