已推薦版本終點時青睞defensively evolving a DTO over time,但我發現很難不失什麼,我認爲通過ServiceStack提供一些關鍵的有益的功能做。在對我的API進行版本控制時,如果我使用相同的DTO,如何維護Swagger文檔?
我目前使用的ServiceStack V3,但是可以升級到V4,如果/當需要時。
在實現我的服務,我可以指定get()方法與不同的合同的多個實現,並且ServiceStack映射數據進來相應。
作品:
public object Get(EntityBrowse) { ... } // returns multiple of a single entity
public object Get(Entity) { ... } // returns a single entity
也可以工作:
public object Get(Contracts.v1.Entity) { ... }
public object Get(Contracts.v2.Entity) { ... }
不起作用:
public object Post(Contracts.v1.Entity) { ... }
public object Post(Contracts.v2.Entity) { ... }
此情況下不能正常工作的地步,通過這個來的所有帖子服務映射到v1合同,即使這些字段不匹配。即使是那些笨拙的文檔也顯示了錯誤的v1屬性,但是v2 DTO中的正確的摘要/註釋。
我想有一個單獨的DTO對於給定端點的每一個主要版本有幾個原因:
揚鞭。從包含很多字段的DTO生成的Swagger文檔可能會讓公共API的最終用戶感到困惑。用戶如何知道哪些字段適用於他們想要使用的端點版本?我可以將每個字段記錄下來,但我認爲向最終用戶顯示他們當時所關心的字段比較容易。不同的客戶會在不知道v1存在的情況下使用v2。
驗證。 ServiceStack爲每個類型提供驗證器。這是完美的,除了如果我的DTO的必需字段可能會隨着時間漂移,我不能繼續使用同一個驗證器沒有一些特殊的外殼。也許這是一個可以接受的損失?
棄用。一段時間後,v1將被棄用。 V1代表端點的遺產執行,之前有版本,和之前有實體之間是一致的合同(例如,使用「名」與「標題」,「TYPEID」與「類型」)。在這個看起來更合理之後,隨着時間的推移發展一個DTO,但是當v1存在時,終端受到開發者在十年前做出的決定的限制。
在閱讀了幾遍後,我想我應該創建單獨的服務來支持舊功能。
我的端點版本之間的主要區別是:
- 權限
- 字段名
- 組織和領域的映射(例如,去除嵌套對象)
- 實現細節(例如,默認返回多少結果)
我應該考慮打破我的版本分開服務?我是否應該加載一個包含所有字段的單個DTO,並概述每個屬性支持的版本?