SORU
5 Mart 2013, Salı


Tavsiye ServiceStack API Yapısı

Bizim API yapısını en iyi şekilde çalışıyorum; standart bir DİNLENME yapısı (liste, liste oluşturmak, vb güncelleme) Kur olduğumuz Yorumları var. Oldukça örnekler uymuyor nerede: her inceleme Olay, örneğin bir veya daha fazla diğer türleri, Yer veya Şey. bağlantılı olabilir

Benim düşünce URL çizgisinde olurdu: /olay/yorumlar/ (veya örneğin /yorumları/olay/bu ters) /konum/yorumlar/ /// incelemeler

Ancak görüyorum ki konu "ALMAK" için bunların her biri ana nesne dönmesi gereken bir Olay yani.

ServiceStack kullanarak bu senaryo işlemek için en iyi yolu nedir? Her veri istemek için özel bir hizmet oluşturmak yerine out-of-the-box geri KALANI kötüye Kur veya gözden kaçan bir şey daha temel var mı?

CEVAP
5 Mart 2013, Salı


"" Çözüm oldukça öznel bir terim. en İyi ilk Genellikle Diğerleri "DİNLENME ilkelerini takip nasıl". en İyi tanımlayabilir buna rağmen, yeniden kullanılabilir KURU, en az çabayı teşvik eden ölçülebilir çözümleri, sürtünme ve konuşkan olmam için nişan alırım Çeşitli tepkiler hedefleri ne bağlı olarak kesilir. Sadece bu yaklaşım istiyorum nasıl teklif edebilirim.

ServiceStack hizmet uygulamaları özel rotalarının de-birleştiğinde

Seni ve hizmetlerini tanımlamak tasarım ServiceStack nasıl aklınızda tutmanız gereken şey, herhangi bir özel rota altında hizmet getirebilir beri de çiftli onları ortaya çıkarmak, nasıl, oldukça. ServiceStack her bir işlem farklı bir mesaj vermek gerekir-tabanlı mesaj tasarımı teşvik eder.

Mantıksal / hiyerarşik bir Url yapısı kullanın

Hiyerarşik olarak, yani ana yol kaynak ayırır yapılandırılmış olan bir isim, tanımlayıcısını temsil etmek amacıyla bir mantıksal bir Url yapısı kullanmak istiyorum ve anlamlı bir bağlam sağlar. Eğer Olaylar ve yorumlar açığa çıkarmak istiyorsan, bu durumda hevesim, aşağıdaki url yapısı ile gitmek.

/events             //all events
/events/1           //event #1
/events/1/reviews   //event #1 reviews

Bu kaynak tanımlayıcıları her biri, herhangi bir HTTP Fiil uygulanmış olabilir

Uygulama

Bu uygulama için genelde mesaj tabanlı bir tasarım ve bir grup ilgili tüm işlemler Yanıt Türüne göre takip ve bağlam arayın. Bunun için böyle bir şey yapacağımı:

[Route("/events", "GET")]
[Route("/events/category/{Category}", "GET")] //*Optional top-level views
public class Events : IReturn<EventsResponse>
{
   //Optional resultset filters, e.g. ?Category=Tech&Search=servicestack
   public string Category { get; set; } 
   public string Search { get; set; }
}

[Route("/events", "POST")]
public class CreateEvent : IReturn<Event>
{
   public string Name { get; set; }
   public DateTime StartDate { get; set; }
}

[Route("/events/{Id}", "GET")]
[Route("/events/code/{EventCode}", "GET")] //*Optional
public class GetEvent : IReturn<Event>
{
   public int Id { get; set; }
   public string EventCode { get; set; } //Alternative way to fetch an Event
}

[Route("/events/{Id}", "PUT")]
public class UpdateEvent : IReturn<Event>
{
   public int Id { get; set; }
   public string Name { get; set; }
   public DateTime StartDate { get; set; }
}

Ve Olay incelemeleri için benzer bir desen izleyin

[Route("/events/{EventId}/reviews", "GET")]
public class EventReviews : IReturn<EventReviewsResponse>
{
   public int EventId { get; set; }
}

[Route("/events/{EventId}/reviews/{Id}", "GET")]
public class GetEventReview : IReturn<EventReview>
{
   public int EventId { get; set; }
   public int Id { get; set; }
}

[Route("/events/{EventId}/reviews", "POST")]
public class CreateEventReview : IReturn<EventReview>
{
   public int EventId { get; set; }
   public string Comments { get; set; }
}

Uygulama 2'de organize ederim ki bu mesajlar, dayalı ileriye oldukça düz olmalıdırEventsServiceveEventReviewsServicesınıflar. Hizmet için çoğullaştırma DTO isimleri Talep kendimi aynı adı veri modelleri ile çatışan önlemek için kullanıyorum dikkat etmelisiniz.

UpdateEvent CreateEvent burada ayrılmış olmama rağmen, bazen kullanmak durumunda izin verirse StoreEvent tek idempotent bir operasyon birleştirmek olacaktır.

Physical Project Structure

İdeal olarak kök düzeyindeAppHostproje basit ve uygulaması-ücretsiz tutulmalıdır. Sadece birkaç hizmetleri ile küçük projeler için her ne kadar her şeyi tek bir projede olmak ve sadece mimari olarak gerektiği zaman ve büyümek için sorun değil.

Bu örnek amacıyla fiziksel yapısı aşağıda öneriyoruz orta-büyük projeler için bizim Uygulama denir kabul edeceğizEventMan.

Projelerin sırası da bağımlılıklarından, örneğin üst düzey EventMan proje referansları göstertümalt projeler EventMan.ServiceModel son proje başvuruları ikenyok:

- EventMan
    AppHost.cs              // ServiceStack ASP.NET Web or Console Host Project

- EventMan.ServiceInterface // Service implementations (akin to MVC Controllers)
    EventsService.cs
    EventsReviewsService.cs

- EventMan.Logic            //For larger projs: pure C# logic, data models, etc
    IGoogleCalendarGateway  //E.g of a external dependency this project could use

- EventMan.ServiceModel     //Service Request/Response DTOs and DTO types
    Events.cs               //Events, CreateEvent, GetEvent, UpdateEvent DTOs 
    EventReviews.cs         //EventReviews, GetEventReview, CreateEventReview
    Types/
      Event.cs              //Event type
      EventReview.cs        //EventReview type

EventMan.ServiceModel DTO kendi ayrı uygulama alanında kaldığı ve ücretsiz bağımlılık dll ile bu dll paylaşmak için özgürce mümkün olacaktır .Herhangi bir kod-gen olmadan uçtan uca yazılan bir API sağlamak için NET istemci proje olarak-genel ile kullanabileceğiniz - C# Service Clients.


Güncelleme

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Digital Bounds

    Digital Boun

    19 Temmuz 2013
  • Elly

    Elly

    3 EKİM 2005
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010