2016-03-25 15 views
6

Uç noktaları uyarlarken defensively evolving a DTO over time'u tercih etmeniz önerilir, ancak ServiceStack tarafından sağlanan bazı önemli faydalı işlevleri düşündüğüm şeyleri kaybetmeden yapmakta zorlanıyorum.API'mı sürümlerken, aynı DTO'yu kullanırsam nasıl swagger belgelerini korurum?

Şu anda ServiceStack v3 kullanıyorum, ancak gerektiğinde v4'e yükseltebilirim.

Hizmetimi uygularken, farklı sözleşmelerle Get() uygulamasının birden çok uygulamasını belirtebilirim ve ServiceStack buna göre verileri eşler.

İşleri:

public object Get(EntityBrowse) { ... } // returns multiple of a single entity 
public object Get(Entity) { ... } // returns a single entity 

Ayrıca Works:

public object Get(Contracts.v1.Entity) { ... } 
public object Get(Contracts.v2.Entity) { ... } 

Çalışmaz:

public object Post(Contracts.v1.Entity) { ... } 
public object Post(Contracts.v2.Entity) { ... } 

Bu dava noktasına çalışmadığı durumlarda bu gelmez tüm mesajları Hizmet alanları eşleşmediği halde, v1 sözleşmesiyle eşleştiriliyor. Kaydırıcı dokümanlar bile yanlış v1 özelliklerini gösteriyor, ancak v2 DTO'sundan alınan doğru özet/notlar.

Birkaç nedenden dolayı belirli bir son nokta her ana sürümü için ayrı DTO istiyorum:

  1. Swagger. Çok sayıda alan içeren DTO'lardan oluşturulan havalı dokümanlar, genel API'lerin son kullanıcılarına kafa karıştırıcı olabilir. Kullanıcı hangi alanları kullanmak istediği son nokta için kullanıyor? Her alan için bunu belgeleyebilirim, ancak son kullanıcının yalnızca ilgilendikleri alanları zamanında göstermenin daha kolay olduğunu düşünüyorum. Farklı müşteriler v1'i v1 kullanmadan bilerek kullanacaklar.

  2. Doğrulama. ServiceStack, her Tür için doğrulayıcı sağlar. Bu mükemmel bir şeydir, ancak eğer DTO'mn gerekli alanları zamanla değişebilirse, bazı özel kasalar olmadan aynı doğrulayıcıyı kullanmaya devam edemem. Belki bu kabul edilebilir bir kayıptır?

  3. Kullanımdan kaldırılıyor. Belirli bir süreden sonra v1 kullanımdan kaldırılacaktır. v1 varlıklar arasındaki tutarlı sözleşmeler (örneğin "Ad" ile "Tür" vs "Kitap Adı", "TypeId" vs) vardı sürüm hiç uğramadan ve öncesinde son nokta mirası uygulanmasını temsil eder. Bundan sonra bir DTO'nun evrimleşmesi daha mantıklı görünmektedir, ancak v1 varken, uç noktalar muhtemelen on yıl öncesine kadar yapılan geliştiriciler tarafından sınırlandırılmaktadır.

Bunu birkaç kez okuduktan sonra, belki de eski işlevselliği desteklemek için ayrı servisler oluşturmam gerektiğini düşünüyorum.Benim uç noktaları sürümleri arasındaki

önemli farklılıklar açıklanmıştır:

  • izinleri
  • alan adları
  • organizasyon ve alanların haritalama (örneğin, iç içe nesnelerin çıkarılması) örneğin
  • uygulama ayrıntıları (varsayılan olarak kaç sonuç döndürülür)

Sürümlerimi kesmeyi dikkate almalıyım hizmetleri ayırmak için? Tüm alanlarla tek bir DTO yükleyip mülk başına desteklenen sürümü özetlemeli miyim?

cevap

3

Aynı Hizmette aynı DTO'nun birden çok sürümünü kullanmamanızı şiddetle öneririm, bunun yerine version your DTO's defensively isteğinde bulunmalısınız, böylece DTO isteğiniz birden çok sürümü destekleyebilir. Aynı Servisin birden çok sürümünü, sürtünme, çoğaltılmış kod, bakım, vb. Neden olan, statik olarak yazılan bir dilde sürdürmeye çalışmak da kötü bir durumdur.

Farklı sürümleri korumanız gerekiyorsa, farklı bakım ve ev sahipliği yapmayı öneririm. şubeleri ve eski ve yeni ServiceStack örneklerine /v1/ ve /v2/ API isteklerini yeniden yönlendirmek için bir ters proxy uygulamanız gerekir. Böylelikle, tüm müşteriler v1'den çıktıktan sonra düşebilir ve v2, geçerli kod tabanını geçerli kod tabanı olmadan temizler. Ancak benim önerim, aynı Talep DTO'sunu sürümlü olarak yayınlamaktır, böylece birden fazla sürümü korumak zorunda kalmazsınız, ServiceStack'ın mesaj tabanlı tasarımı bunu çok daha kolaylaştırır. Aynı zamanda hem içeride hem de dışarıdaki karışıklığı azaltacak, birden fazla versiyonu korumaya çalışacak olan, Hizmetlerin bakımı yapan Geliştiriciler ve bunları tüketen herkes için kafa karıştırıcıdır.

ServiceStack isteğinde her DTO Türü benzersiz olmalı ve yalnızca tek bir uygulama olmalıdır, ancak çoğu meta veri hizmeti, DTO adına isteğin de benzersiz olmasını gerektirir ve Add ServiceStack Reference'daki dillerin çoğu, tüm DTO'ların benzersiz olmasını gerektirir. bizim önerimiz. Farklı sürümlerde mutlaka farklı türler olması gerekiyorsa, DTO isteğinde bulunan sürümü ekleyin, örn. GetEntitiesV1 ve GetEntitiesV2 - bu adlar yayınlanan Özel Rotalarınızı kullanan kullanıcılardan gizlenecektir. Eğer v3 sorunları görürseniz

ServiceStack's Swagger Support

Eğer sorunlar çözüldü olmadığını görmek için Free Quotas in v4 kullanabilirsiniz, v4 Güncellemelerin çok gördü.