zukucode
主にWEB関連の情報を技術メモとして発信しています。

C# recordでAPIのリクエストとレスポンスを定義する

recordを使用すると、データを受け渡すためのクラスを短く定義できます。

ここでは、ID、名前、価格のまとまりを値として受け渡し、作成後にプロパティを変更しないDTOへrecordを使います。状態を段階的に変更するオブジェクトや、インスタンスそのものの同一性が重要なオブジェクトまで、すべてrecordにする必要はありません。

recordを定義する

public sealed record ProductResponse(
    Guid ProductId,
    string Name,
    decimal Price
);

この1行で、コンストラクターと読み取り専用プロパティが作成されます。

var product = new ProductResponse(
    Guid.NewGuid(),
    "ノート",
    200m
);

Console.WriteLine(product.Name);

APIのリクエストに使用する

public sealed record ProductCreateRequest(
    string Name,
    decimal Price
);

[HttpPost]
public IActionResult Create(ProductCreateRequest request)
{
    var result = new ProductResponse(
        Guid.NewGuid(),
        request.Name,
        request.Price
    );

    return Ok(result);
}

JSONのnamepriceが、それぞれのプロパティへ設定されます。

{
  "name": "ノート",
  "price": 200
}

withで一部だけ変更する

var discounted = product with { Price = 180m };

元のproductは変更せず、Priceだけが異なる新しい値を作成します。

classとの違い

recordは初期状態で値による比較を行います。

var first = new ProductResponse(Guid.Empty, "ノート", 200m);
var second = new ProductResponse(Guid.Empty, "ノート", 200m);

Console.WriteLine(first == second); // True

通常のclassは、同じ内容でも別のインスタンスなら等しくないのが基本です。

recordにもメソッドを書けます。ただし、APIのDTOなど値を受け渡す用途から使い始めると特徴を理解しやすくなります。

データだけを表す型では、recordを使用すると定義を簡潔にできます。


関連記事