是的,只要通信进程在同一台服务器上运行,您就可以使用命名管道作为WCF 绑定 。基本上,您创建 WCF 服务就像您使用任何其他绑定(如 TCP/IP)一样,但您需要将端点配置为使用.netNamedPipeBinding
如果您想保留/保存数据,则可以根据您的要求将其保存到文件甚至数据库中。如果您只是想保留数据直到 ServiceC 调用它,那么Dictionary<Guid, SomeLargeItem>就足够了。
所以你的流程看起来像:
- 客户端调用 ServiceA_Proxy.Upload(someLargeItem) 返回 Guid
- ServiceA 调用 ServiceB_Proxy.Upload(GuidFromCall_1, someLargeItem)
- 客户端然后调用 ServiceC_Proxy.DoSomeWork(GuidFromCall_1) (您需要首先确保上传完成)
- ServiceC 调用 ServiceB_Proxy.Download(GuidFromCall_1)
- ServiceC 调用 DoSomeWork(GuidFromCall_1) (内部)
- ServiceC 调用 ServiceB_Proxy.Upload(GuidFromCall_1, someLargeItemProcessed)
- 客户端然后调用 ServiceA_Proxy.Download(GuidFromCall_1) (同样,您需要确保处理完成)
- ServiceA调用ServiceB_Proxy.Download(GuidFromCall_1),返回给Client。
- 客户端显示给最终用户
我不确定我没有搞砸什么。如您所见,这变得非常复杂。您需要问自己这是要走的路,如果以这种方式拆分您的服务真的会使其更具可扩展性吗?您计划使用 NamedPipes,因此所有处理仍将在同一台机器上。
你真的应该考虑你的设计。也许将功能拆分为一些 *.dll 并直接调用它们就足够了?这样,您将实现层的逻辑分离。
从缓冲通信切换到流通信不需要您将逻辑拆分为更多服务。
如果您想要真正的可扩展性,请考虑使用队列(例如MSMQ)并为每个服务使用单独的机器。