Service実装パターン
このガイドでは、MBC CQRS ServerlessでCRUD操作を処理するサービスクラスの実装方法を説明します。サービスはビジネスロジックの中核であり、コントローラー、コマンド、データアクセスを調整します。
このガイドを使用するタイミング
以下が必要な場合にこのガイドを使用してください:
- 新しいドメインエンティティのサービスレイヤーを構築する
- 作成、読み取り、更新、削除(CRUD)操作を実装する
- マルチテナントデータの分離を処理する
- 並行更新のための楽観的ロックを使用する
- 大量データ処理のためのバッチ操作を実装する
このパターンが解決する問題
| 問題 | 解決策 |
|---|---|
| データベースへの直接アクセスはCQRSパターンをバイパスする | 書き込みにはCommandService、読み取りにはDataServiceを使用する |
| データ変更の監査証跡がない | ユーザーとタイムスタンプを記録するためにinvokeContextを渡す |
| 並行更新が互いを上書きする | 楽観的ロックのためにversionフィールドを使用する |
| 同期処理による遅いレスポンス | 非ブロッキングコマンド発行のためにpublishAsyncを使用する |
基本的なService構造
一般的なサービスは、書き込み操作にCommandService、読み取り操作にDataServiceの両方を使用します:
import {
CommandService,
DataService,
generateId,
getUserContext,
IInvoke,
VERSION_FIRST,
KEY_SEPARATOR,
} from "@mbc-cqrs-serverless/core";
import { Injectable } from "@nestjs/common";
import { ulid } from "ulid";
import { PrismaService } from "src/prisma";
import { ProductCommandDto } from "./dto/product-command.dto";
import { ProductDataEntity } from "./entity/product-data.entity";
import { CreateProductDto } from "./dto/create-product.dto";
import { UpdateProductDto } from "./dto/update-product.dto";
const PRODUCT_PK_PREFIX = "PRODUCT";
@Injectable()
export class ProductService {
constructor(
private readonly commandService: CommandService,
private readonly dataService: DataService,
private readonly prismaService: PrismaService,
) {}
// CRUD methods will be implemented below (CRUDメソッドは以下で実装)
}