Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ドメイン駆動設計において、Rails の after_create や after_save 相当の知識はどのオブジェクトに持たせると良いでしょうか?

Discussion

Closed

関連エンティティの更新処理をどこに持たせるべきか

RailsではActiveRecordがエンティティの責務を持っています。(他にも色々持ちすぎですが :sweat_smile:

あるエンティティが作成・更新されたときに関連エンティティも絶対に更新しなければならない場合、RailsではActiveRecordの after_createafter_save を使って実現することができます。

参考: Active Record コールバック - Railsガイド

Railsではなく、C#やJavaなどの静的型付け言語を採用したドメイン駆動設計において、「あるエンティティが作成・更新されたときに関連エンティティも絶対に更新しなければならない」という知識は、どのオブジェクトに持たせるとよいでしょうか?

候補は、

  • エンティティ 
  • ドメインサービス
  • アプリケーションサービス

のいずれかだと思いますが、どれにすべきか悩んでいます。
どなたかアドバイスお願いしたいです。

参考

2

個人的にはドメインサービスになるかな、と思っています。
そもそもの前提として「何かのエンティティの変更には必ずあるエンティティの変更も伴う」という知識はドメイン知識であると考えています。そのためその処理は必然的にドメインオブジェクトに記述されることになります。

その時に考えなけばならないのは「誰がその変更処理を行うのか」ということです。
例えばエンティティA、エンティティBが存在し、Aの作成後必ずBも作成する必要がある場合、この処理は誰の責務になるのでしょうか?例えばAかBであると考えた場合、どちらか一方のエンティティは自身を作成し、他方を作成するという処理ができることを意味します。しかしそもそもなんですが、DDDを考える上で「自身を作成するという」という処理はあまりないのかな、と考えています(そもそもの現実世界にそのような振る舞いをもつモデルがあまりない)
となると作成するのはAでもBではない誰かになるのですが、実体としてそれを捉えるのは難しそうです。
なので最後の選択肢としては「ドメインサービス」になるのかな、と考えています。

3Like

確かに、A, B両方のエンティティを作成する責務を持つのは誰かと考えると、いずれかのエンティティではなく、ドメインサービスがよさそうですね。

ただし、ドメインサービスに実装する場合は、

  • Aのエンティティを直接作成してはいけない
  • Aのエンティティはドメインサービス経由で作成しなければならない

という新たなルールが生まれてしまうことになります。

このルールはどのように実装するといいのかな、と思いました。

1Like
  • Aのエンティティを直接作成してはいけない
  • Aのエンティティはドメインサービス経由で作成しなければならない

ここはScalaのアクセス限定子のようなものがあると実現ができそうですが、Railsだと実現方法がパッと浮かびませんでした...

@atm-snag こちらどう思いますか?

0Like

Your answer might help someone💌