我们正在开发Web API RESTful服务,为我们企业所有应用程序提供通用数据访问。为了帮助,我们还将发布一个客户端API,它封装了所有HttpClient的细节,并提供了对数据的强类型访问。
我们的目标是从小处开始逐步添加功能,同时仍然保持向后兼容已部署版本的客户端API(与相同主要版本的客户端兼容)。
在讨论设计时,我们的团队刚刚进行了一次非常长的讨论,讨论是否应该在服务器和客户端之间共享类型(例如通过版本化的NuGet包),并得出了利弊...但我们没有成功决定走何种方式。
共享类型(共享程序集)
优点: - 客户端模型和服务器模型始终保持最新状态 - 没有序列化/反序列化问题,因为相同的类型被序列化/反序列化 - 没有重复
缺点: - 需要找到一种方法在服务器和客户端之间共享类型 - 即使对于序列化Json没有影响,也可能会破坏现有的客户端应用程序(更改服务器模型中类或其命名空间的名称) - 可能会意外破坏客户端
为客户端和服务器分别使用结构等效的类型
优点: - 客户端“模型”与服务器实现耦合度较低(只是服务器输出的Json的镜像,但没有硬性的“同一类型”关系) - 服务器模型可以自由演变而不会破坏任何客户端 - 可以独立于服务器模型增强客户端模型 - 客户端模型是客户端包的一部分,没有需要在服务器和客户端之间维护的“共享包”
缺点: - 在服务器代码和客户端代码之间存在重复在服务器端和客户端之间保持结构同步是一个容易出错的任务
我们的目标是从小处开始逐步添加功能,同时仍然保持向后兼容已部署版本的客户端API(与相同主要版本的客户端兼容)。
在讨论设计时,我们的团队刚刚进行了一次非常长的讨论,讨论是否应该在服务器和客户端之间共享类型(例如通过版本化的NuGet包),并得出了利弊...但我们没有成功决定走何种方式。
共享类型(共享程序集)
优点: - 客户端模型和服务器模型始终保持最新状态 - 没有序列化/反序列化问题,因为相同的类型被序列化/反序列化 - 没有重复
缺点: - 需要找到一种方法在服务器和客户端之间共享类型 - 即使对于序列化Json没有影响,也可能会破坏现有的客户端应用程序(更改服务器模型中类或其命名空间的名称) - 可能会意外破坏客户端
为客户端和服务器分别使用结构等效的类型
优点: - 客户端“模型”与服务器实现耦合度较低(只是服务器输出的Json的镜像,但没有硬性的“同一类型”关系) - 服务器模型可以自由演变而不会破坏任何客户端 - 可以独立于服务器模型增强客户端模型 - 客户端模型是客户端包的一部分,没有需要在服务器和客户端之间维护的“共享包”
缺点: - 在服务器代码和客户端代码之间存在重复
在我们团队中,似乎对于每种解决方案都有50/50的偏好。
个人而言,我更喜欢第二个选项,因为我认为RESt是关于解耦的,而解耦意味着客户端不应该关心服务器端如何实现(哪些类型、或者是否是.NET应用程序),但我希望我们可以通过代码生成或类似方法来消除可能的重复,但找不到任何有关此主题的指导。
共享客户端和服务器之间的类型还有其他优缺点吗?
如果我们不共享它们,那么在尝试保持客户端模型和服务器模型同步时,有没有降低维护成本的方法?