c# - 如何跨不同的编程语言共享业务概念?

标签 c# c++ python serialization cross-language

我们开发了一个分布式系统,该系统由以不同编程语言(C++、C# 和 Python)实现的组件构建,并通过网络相互通信。 系统中的所有组件都以相同的业务概念运行,并且也根据这些概念相互通信。

因此,我们面临以下两个挑战:

  1. 使我们的业务概念在这三种语言中的表达保持同步
  2. 跨这些语言对我们的业务概念进行序列化/反序列化

对于这个问题,一个简单的解决方案就是定义相同的数据结构(和序列化代码)三次(对于 C++、C# 和 Python)。

不幸的是,这个解决方案有严重的缺陷:

  • 它会产生很多“代码重复”
  • 它需要大量的跨语言集成测试来保持一切同步

我们考虑的另一个解决方案是基于 ProtoBufs 或 Thrift 等框架。这些框架有一种内部语言,其中定义了业务概念,然后这些框架会自动生成这些概念在 C++、C# 和 Python 中的表示(连同序列化逻辑)。

虽然此解决方案没有上述问题,但它还有另一个缺点:这些框架生成的代码将代表底层业务概念的数据结构和序列化/反序列化这些数据结构所需的代码耦合在一起。

我们觉得这污染了我们的代码库——我们系统中使用这些自动生成的类的任何代码现在都“熟悉”这种序列化/反序列化逻辑(严重的抽象泄漏)。

我们可以通过用我们的类/接口(interface)包装自动生成的代码来解决这个问题,但这会让我们回到幼稚解决方案的缺点。

谁能推荐一个解决上述问题的解决方案?

最佳答案

列夫,你可以看看ICE .它提供面向对象的 IDL,并映射到您使用的所有语言(C++、Python、.NET(据我所知,所有 .NET 语言,不仅仅是 C#))。尽管 ICE 是一个中间件框架,但您不必遵循它的所有策略。

特别是在您的情况下,您可能希望在 ICE IDL 中定义组件的接口(interface),并将它们作为代码的一部分进行维护。然后,您可以生成代码作为构建例程的一部分并从那里开始工作。或者,您可以使用 ICE 提供的更多功能。

ICE 支持 C++ STL 数据结构并支持继承,因此它应该为您提供足够强大的形式主义,以便随着时间的推移逐渐构建您的系统,并具有良好的可维护性。

关于c# - 如何跨不同的编程语言共享业务概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11802505/

相关文章:

c# - 是否清除包含 ComObject 的列表,在 C# 中释放所有这些对象?

c++ - 你如何制作一个带有纹理映射的立方体,在内部和外部显示不同的纹理

python - <类 'socket.error' >([错误 111] 连接被拒绝)

c# - 如何首先在 Entity Framework 代码中创建 2 个相同类型的 dbsets?

c# - 如果 smtp 服务器需要授权,我如何使用 .NET 4 发送电子邮件?

c# - Linq to entities 支持哪些语句?

C++ 错误 : Class has-a-relationship with Struct in Same Header File

c++ - 乱序模板参数规范/推导是否可能?

python - 通过更新现有字典创建新字典

python - 基于字段创建 stock.location - Odoo v9 社区