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のnameとpriceが、それぞれのプロパティへ設定されます。
{
"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を使用すると定義を簡潔にできます。