ホームページ >バックエンド開発 >C++ >ServiceStack で効率的で一貫性のあるリクエスト DTO を設計するにはどうすればよいですか?

ServiceStack で効率的で一貫性のあるリクエスト DTO を設計するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-31 16:16:10816ブラウズ

How to Design Efficient and Consistent Request DTOs in ServiceStack?

ServiceStack Request DTO Design

RESTful API では、異なる目的を果たす複数のサービスが存在するのが一般的です。固有のリクエストごとに個別のサービスを作成することは誘惑的ですが、不必要な重複やアーキテクチャの肥大化につながる可能性があります。 ServiceStack は別のアプローチを推進し、呼び出しセマンティクスと応答タイプに基づいてサービスをグループ化することを奨励します。

サービス操作とタイプの区別

サービス操作 (リクエスト DTO) は、サービスの固有のアクションをキャプチャする必要があります。一方、返される DTO タイプはエンティティまたはデータ コンテナを表します。リクエスト DTO はアクションを伝えるために動詞 (例: 「Get」、「Find」) を使用する必要がありますが、DTO タイプはエンティティを表すために名詞 (例: 「Customer」、「Product」) を使用する必要があります。

Returning一般的な応答

一般的な 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。