あべぶろ

気になった技術の備忘録を残します。

【ドメイン駆動設計】サンプル(iddd_agilepm)を読解く その1

概要

IDDD本のサンプルソースがあるのでそれを読み解く。
結構な量があるので、iddd_agilepmから読解いて見ようと思う。
今回は、パッケージ構成を見てみる。

iddd_agilepm

まず、IDDD本の中で登場する架空の企業であるSaaSOvation社は、
アジャイルプロジェクト管理ツールを開発しており、
この「iddd_agilepm」はアジャイルプロジェクト管理コンテキストとなる。
アジャイルプロジェクト管理ツールとは既存製品で言うJIRAやPivotal Trackerみたいなものであり、
「プロダクト」や「バックログアイテム」などの概念が存在する。

パッケージ構成

全体構成はこんな感じ。
大きくわけると「application」「domain/model」「port/adapter」の3つに分けられる。

agilepm
├── application
│   ├── notification
│   ├── process
│   ├── product
│   │   └── backlogitem
│   ├── sprint
│   └── team
├── domain
│   └── model
│       ├── discussion
│       ├── product
│       │   ├── backlogitem
│       │   ├── release
│       │   └── sprint
│       ├── team
│       └── tenant
└── port
    └── adapter
        ├── messaging
        │   ├── rabbitmq
        │   └── sloth
        └── persistence;

applicationパッケージ

  • アプリケーションサービスが存在する。
  • アプリケーションサービスに渡す、Commandクラスが存在する。
  • サブパッケージはサービス単位で切られている。
    • domain/modelパッケージとの関連性が見れる。
    • sprintパッケージは、product配下じゃなくていいのかな??

domain/modelパッケージ

  • エンティティと値オブジェクト、ドメインイベントが存在している。
  • リポジトリインターフェイスが存在する。
    • 実装はport/adapterパッケージ配下に存在する。
    • 依存関係逆転の法則ってやつ?

port/adapterパッケージ

  • ヘキサゴナルアーキテクチャを採用している。
    • よくあるのはinfrastructureパッケージ
  • RabbitMQによるイベント処理と、LevelDBによる永続化処理が実装されている。
    • presistence配下に、leveldbというサブパッケージを切ってもいいと思う。