RESTful API では、異なる目的を果たす複数のサービスが存在するのが一般的です。固有のリクエストごとに個別のサービスを作成することは誘惑的ですが、不必要な重複やアーキテクチャの肥大化につながる可能性があります。 ServiceStack は別のアプローチを推進し、呼び出しセマンティクスと応答タイプに基づいてサービスをグループ化することを奨励します。
サービス操作 (リクエスト DTO) は、サービスの固有のアクションをキャプチャする必要があります。一方、返される DTO タイプはエンティティまたはデータ コンテナを表します。リクエスト DTO はアクションを伝えるために動詞 (例: 「Get」、「Find」) を使用する必要がありますが、DTO タイプはエンティティを表すために名詞 (例: 「Customer」、「Product」) を使用する必要があります。
一般的な GET リクエストの場合、ServiceStack は応答に ResponseStatus プロパティを必要としませんDTO。代わりに、エラーが発生した場合、汎用の ErrorResponse DTO がスローされ、クライアント上でシリアル化されます。これにより、応答で明示的な ResponseStatus プロパティを使用する必要がなくなります。
可読性と自己記述を強化するために、サービス コントラクトで一貫した命名法を使用することをお勧めします。 「Get」動詞は、一意の識別子に基づいて単一の結果を取得するサービス用に予約してください。複数の結果を返す検索サービスの場合は、「Find」または「Search」プレフィックスを使用します。さらに、リクエスト DTO 内で目的を示す明確で説明的なプロパティ名を指定します。
これらの原則に基づいて、次のリファクタリングされた予約制限サービスが提案されます。
[Route("/bookinglimits/{Id}")] public class GetBookingLimit : IReturn<BookingLimit> { public int Id { get; set; } } public class BookingLimit { public int Id { get; set; } public int ShiftId { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public int Limit { get; set; } } [Route("/bookinglimits/search")] public class FindBookingLimits : IReturn<List<BookingLimit>> { public DateTime BookedAfter { get; set; } }
サービスの実装各リクエスト DTO ではなく、サービス クラスに [Authenticate] 属性を 1 回適用することで簡素化できます。次のコードは、この実装を示しています。
[Authenticate] public class BookingLimitService : AppServiceBase { public BookingLimit Get(GetBookingLimit request) { ... } public List<BookingLimit> Get(FindBookingLimits request) { ... } }
エラー処理と検証は、ServiceStack の組み込み Fluent Validation 機能を使用してカスタマイズできます。バリデーターをサービスに挿入する代わりに、次の行を使用して AppHost にバリデーターを登録できます:
container.RegisterValidators(typeof(CreateBookingValidator).Assembly);
副作用のある操作 (例: POST/PUT) の場合、次のようなバリデーターを定義できます。 :
public class CreateBookingValidator : AbstractValidator<CreateBooking> { public CreateBookingValidator() { RuleFor(r => r.StartDate).NotEmpty(); RuleFor(r => r.ShiftId).GreaterThan(0); RuleFor(r => r.Limit).GreaterThan(0); } }
以上がServiceStack で効率的で一貫性のあるリクエスト DTO を設計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。