ServiceStack のベスト プラクティス: 複雑なオブジェクト関係を処理するための REST API 設計
コメント、イベント、場所、物間の関係など、複雑なオブジェクト関係を含む REST API を設計する場合、課題が頻繁に発生します。この記事では、ServiceStack を使用してこのようなシナリオに対処する最適な方法を検討します。
論理的な階層 URL 構造を採用します
リソースの階層とコンテキストを表すには、親パスに基づいてリソースを分類する論理 URL 構造の使用を検討してください。たとえば、次の構造はイベントとそのコメントを表します:
<code>/events //所有事件 /events/1 //事件 #1 /events/1/reviews //事件 #1 的评论</code>
この構造により、任意の HTTP 動詞を各リソース識別子に適用できます。
メッセージベースの設計とサービスの実装
ServiceStack サービスはカスタム ルートから分離されています。メッセージ タイプと呼び出しコンテキストに基づいてサービスを設計します。この場合、SearchEvents、GetEvent、CreateEventReview などの操作ごとに異なるメッセージを作成することを検討してください。
サービス実装例
イベントおよびイベントコメントサービスの実装例:
EventsService.cs
<code class="language-csharp">[Route("/events", "GET")] public class SearchEvents : IReturn<SearchEventsResponse> { //可选结果集过滤器,例如 ?Category=Tech&Query=servicestack public string Category { get; set; } public string Query { 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")] //可选 public class GetEvent : IReturn<Event> { public int Id { get; set; } public string EventCode { get; set; } //获取事件的替代方法 } [Route("/events/{Id}", "PUT")] public class UpdateEvent : IReturn<Event> { public int Id { get; set; } public string Name { get; set; } public DateTime StartDate { get; set; } }</code>
EventReviewsService.cs
<code class="language-csharp">[Route("/events/{EventId}/reviews", "GET")] public class GetEventReviews : IReturn<GetEventReviewsResponse> { 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; } }</code>
プロジェクトの物理構造
ルートレベルのプロジェクトを軽量に保つためにプロジェクト構造を整理します。中規模から大規模のプロジェクトの場合は、次の構造を検討してください:
<code>- EventMan AppHost.cs - EventMan.ServiceInterface EventsService.cs EventsReviewsService.cs - EventMan.Logic IGoogleCalendarGateway - EventMan.ServiceModel Events.cs EventReviews.cs Types/ Event.cs EventReview.cs</code>
クライアント プロジェクトで ServiceModel DLL を使用する
ServiceModel DTO を別の実装と依存関係のない DLL に保持することで、任意の .NET クライアント プロジェクトで共有し、型指定された API に共通の C# サービス クライアントを利用できます。
以上がServiceStack で複雑なオブジェクト関係を持つ効率的な REST API を設計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。