2

我想分离我的程序的模块以相互通信。它们可以在同一台计算机上,但也可能在不同的计算机上。

我正在考虑两种方法:

  1. 创建一个包含所有详细信息的类。将其发送到通信层。这个序列化它,发送它,另一端将它反序列化回类,然后进一步处理它。
  2. 创建一个哈希表(键/值事物)。将所有数据放入其中。将其发送到通信层等

所以它归结为哈希表与类。

如果我认为“松散耦合”,我喜欢哈希表。更新一个模块很容易,在 hastable 中包含新的额外参数,而无需更新另一侧。

然后再次使用一个类,我得到编译时类型检查,而不是运行时。

以前有没有人解决过这个问题并对此有建议?

谢谢!

编辑:我已经给与我原来的问题最相关的答案打了分,尽管它不是最受好评的答案

4

5 回答 5

4

听起来您只是想将一些IPC(进程间通信)合并到您的系统中。

在 .NET(3.0 及更高版本)中实现此目的的最佳方式是使用Windows Communication Foundation (WCF) ——由 Microsoft 开发的通用框架,用于在通用基础上以各种不同方式(传输)在程序之间进行通信。

尽管我怀疑您可能会出于效率和稳健性的目的而使用命名管道,但还有许多其他可用的传输方式,例如 TCP 和 HTTP(请参阅此 MSDN 文章),更不用说从二进制到XML 到 JSON。

于 2009-08-16T11:49:39.960 回答
2

人们倾向于在分布式系统设计中遇到这种问题。它出现在 Web 服务(定义参数和返回类型的 WSDL)消息系统中,其中消息的格式可能是 XML 或其他一些明确定义的格式。在所有情况下,控制客户端和服务器耦合的问题仍然存在。

你的哈希表会发生什么?假设您的请求包含“NAME”和“PHONE-NUMBER”,突然您意识到需要区分“LANDLINE-NUMBER”和“CELL-NUMBER”。如果您只是更改哈希表条目以使用新值,那么您的服务器需要同时更改。假设此时您不仅有一个客户端和一个服务器,而且可能正在处理某种交换或代理系统,许多团队实现了许多客户端,许多团队实现了许多服务器。要求他们所有人同时升级到新的消息格式是一项艰巨的任务。

因此,我们倾向于寻求可回溯的解决方案,例如添加更改,我们保留“PHONE-NUMBER”并添加新字段。服务器现在可以容忍包含旧格式或新格式的消息。

不同的分发技术对向后兼容具有不同的内置容忍度。在处理序列化类时,您可以处理旧版本和新版本吗?在处理 WSDL 时,消息解析器是否会容忍附加更改。

我将遵循以下过程:

1)。您是否会在客户端和服务器之间建立简单的关系,例如您是否对两者进行编码和控制,可以自由决定它们的发布周期。如果“否”,则支持灵活性,使用哈希表或 XML。

2)。即使您可以控制,请查看您的序列化框架支持版本控制的难易程度。强类型化、序列化的类接口很可能更容易使用,前提是您清楚地了解更改接口需要做什么。

于 2009-08-16T12:09:28.913 回答
0

对远程处理的内置支持发生了什么?

http://msdn.microsoft.com/en-us/library/aa185916.aspx

如果需要,它适用于 TCP/IP 或 IPC。它比 WCF 更快,并且对您的代码非常透明。

于 2009-08-16T12:04:33.933 回答
0

您可以使用 Sockets、Remoting 或 WCF,eash 各有利弊。

但是,如果性能不是很重要,您可以使用 WCF 并序列化和反序列化您的类,为了获得最佳性能,我推荐使用套接字

于 2009-08-16T12:10:10.720 回答
-1

根据我们在过去几年中广泛使用 WCF 和各种绑定的经验,我们发现 WCF 不值得麻烦。

正确使用 WCF 非常复杂,包括正确处理通道上的错误同时保持良好的性能(我们很早就放弃了 wcf 的高性能)。

对于经过身份验证的客户端场景,我们切换到 http rest(没有 wcf)并进行 json/protobuf 负载。

对于高速非认证场景(或至少非 kerberos 认证场景),我们现在使用 zeromq 和 protobuf。

于 2011-02-09T10:45:21.733 回答