在不同项目之间共享类或接口


17

我一直在寻找SO或此处的一些答案,但是没有任何结果,这就是为什么我要问你。

假设我有两个不同的项目-例如应用程序的服务器部分和客户端部分。我正在开发自己的部分,而我的朋友正在制作第二部分。但是我们两个都应该使用一些通用接口,例如Useror AccountInfoChangableAccount...,以确保兼容性。例如,如果客户端将用户数据发送到服务器,则服务器应在同一类上运行。接口等也是如此。此外,如果公共接口中有任何更改,则两个项目都应根据新情况调整其代码。

我现在看到的唯一解决方案是,创建一个额外的项目,在其中定义所有常见的事物。我们和我的朋友应该将此项目添加为对主项目(客户端或服务器)的依赖项。共享项目可以通过某些版本控制系统进行管理,因此我们始终处于最新状态。

您还建议什么其他解决方案?在专业应用中如何解决此类问题?


1
您应该控制版本是否共享。您是在说没有对客户端和服务器项目使用版本控制吗?如果是这样,请立即进行补救。
塞巴斯蒂安·雷德尔

Answers:


15

创建一个额外的项目,在其中定义所有常见的事物

这正是共享可重用部分的第一步-也是简单的部分。更具挑战性的部分是确定使用共享库的两个项目是否应具有独立的发行周期(或没有),以及“项目A”是否应使用共享库的版本1.0,而项目B是否应使用共享库的版本。 2.0版本在同一时间

如果您希望后者成为可能,则需要对库进行严格的版本控制和发布管理(以及库文件名中的版本号,如@RoryHunter所建议)。在这种情况下,您还应该注意lib中的向后兼容性。应该将您的库作为单独的产品进行管理,向其中添加单元测试以确保生产中的不同版本是个好主意,并且Maven之类的工具也很有意义。

但是,如果要避免这种情况,则应将“项目A”,“项目B”和lib作为一个通用项目进行管理,并结合开发,构建和发布过程。与第一种情况相比,这将允许更频繁地更改共享库的公共接口。而且,库文件名中不需要Maven或版本号。但是要权衡的是A和B不能再独立开发了。


13

您的解决方案是正确的。将共享代码放入另一个构建自己的JAR文件的项目中,并在两个项目中都使用它。在构建JAR文件时,您可能需要在名称中包含版本,例如Debian风格。

libmyproject-shared-1.0.jar

它不能防止版本问题,但应该可以。我从未使用过Maven,但我知道它可以在这种情况下提供帮助。


2

创建一个额外的项目,在其中定义所有常见的事物

这正是.Net期望您这样做的方式。

将这些对象抽象到第三个Assembly中,并从两个项目中引用此对象。我建议这样做是更干净的接口,但是...

注意序列化:

  • 我可以在两个程序之间直接序列化/反序列化对象的唯一方法(承认这是前一段时间使用Framework 2.0),是将“共享”程序集安装到客户端和服务器计算机上的Global Assembly Cache中。如果程序集对于每个项目都是“本地”的,则框架会将它们视为离散类型,并拒绝将它们反序列化为另一个。
  • 而且,将[反]序列化为接口的对象序列化是“挑战”。原始的非接口类型似乎没有通过序列化“管道”“完成”,因此接收者不知道要从传入流中“构建”什么具体类型。

1

正如其他人所建议的那样,您的思维过程是准确的。专业上,大多数人会使用MavenGradle之类的东西来有效地管理这些依赖项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.