LoginSignup
2
2

More than 3 years have passed since last update.

DDD+CQRSで、クエリでも使う業務知識はロールにしてみる(DCI的な)

Posted at

はじめに

DDD+CQRSで実装すると業務知識がドメインサービスにばかりいってしまう(気がする)で悩んでいた時に、
境界づけられたコンテキストをDCIで考えてみるでDCIについて勉強したところ、
クエリで取得したDTOにロールを与えれば良いんじゃないの?と思ったので投稿してみます。

前提

DDD+CQRSで実装すると業務知識がドメインサービスにばかりいってしまう(気がする)で話していた利益率計算についての続きです。

ざっくり書くと
a.png
のように利益率計算に関するメソッドをエンティティに入れちゃうとクエリ側で使用するの大変だよねって話です。なのでドメインサービスに置くしかないかなと思ってました。
b.png

けど利益率に関するメソッドが増えてきたら何を使えば良いかわからなくなりそうな気がしていました。

ドメインサービスに散らばっていた利益率に関する知識をロールにまとめる

そこで出会ったのがDCIという考え方。自分の中ではデータクラスにロール(役割)を与えるイメージです。文脈によってロールを切り替えてユースケースを実現します。

image.png

こんな感じでI利益率を取得するとかI利益率計算とか利益率に関する業務知識がドメインサービスに散らばっていたのをI利益率を計算するロールという役割としてまとめちゃいます。

そうすればDDD+CQRSで実装すると業務知識がドメインサービスにばかりいってしまう(気がする)で問題にしていた

しかしエンティティ内に記述してしまうと、別の場所で利益率計算をしたくなったときに困ります。
たとえば利益率がn%だったときの原価と売値の一覧を画面に表示したいといった場合、
CQRS的なクエリでエンティティを介さずDTOに包んで値を取得したときに利益率計算をしようと思っても出来ません。

もDTOを定義する際に
image.png

のようにI利益率を計算するロールを継承してしまえばクエリ側でも業務知識を無理なく使える気がします。

まとめ

  • エンティティでしか使わない業務知識はエンティティに実装する
  • クエリ(CQRS的な)でも使用する業務知識はドメインサービスとして実装する
  • 業務知識としてロール(役割)としてまとめることができるのならばロールを用意する

と思ったんですけどどうでしょうか。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2