Chapter 12無料公開

✅Domainは1つのエンティティについて処理する

たった
たった
2021.06.25に更新
このチャプターの目次
アプリケーションコード
src
├── middleware     ... 認証・認可とGraphQLのコンテキスト
>├── domain         ... ビジネスロジックの共通化
├── usecases       ... アプリケーションロジック
├── infrastructure ... 外部サービスとのやりとり
├── entities       ... エンティティとGraphQLのフィールド
├── resolvers      ... GraphQLのリゾルバー
└── inversify.config.ts ... 依存性の注入(以下、DI)の設定

このチャプターで使用するライブラリ

  • TypeORM
  • InversifyJS

概要

Domainはソフトウェアが解決したい領域のビジネスロジックを集約します。その意味でプロジェクト毎に最も柔軟で変化が大きいモジュールになります。

このチャプターでは、Domainは1つのエンティティについてのみ処理するべきという提案を解説します。これによって処理の主体が明確になり、可読性を高めることができます。

改めて先のチャプターと同様、以下の仕様を追加することにした場合のDomainの実装を見ていきましょう。

  • ユーザを作成する
    • リクエストしてきたユーザを新しいユーザとして登録する

実装

受け取ったマネージャを使って、エンティティに対して処理を行います。

be/src/domain/UserDomain.ts
import { EntityManager } from 'typeorm' 
import { UserAddVo } from 'src/usecases/types/UserType' 

@injectable()
export class UserDomain {
  public async addUser(
    manager: EntityManager,
    vo: UserAddVo,
  ) {
    const entity = manager.create(User, vo)
    return await manager.save(entity)
  }
}

この時、「どのようにConnectionを管理する」や「何件処理する」といった仕様をDomainは知りません。それらの仕様はUsecaseが管理します。Domainは業務に必要な知識を知っており、それを1つずつ処理します。

実際のプロダクトコードでは、もっとコンテキストを明確にしたり、複雑な処理を行ったりすることになります。その場合でも、常に処理の主体(=エンティティ)を明確にし、1件ずつ処理することで、可読性を保つことができます。