まだ DDD を試していて、疑問がある場合は、誰かが私を助けてくれるかもしれません。
私は2つのモデルを持っているとしましょう:
public class Event
{
User Creator;
List<User> Members;
}
public class User {}
私の問題は、実装したいロジックの場所が見えないことです。3つのアクションが必要です:
- ユーザー参加イベント
- ユーザー退会イベント
- 作成者はイベントからユーザーを削除します (作成者のみがユーザーを削除できます)
今のところ、 Event.RemoveUser/AddUserを呼び出すドメイン サービスEventUserServiceを作成しました。CurrentUser ( UserServiceによって提供される) がイベントの作成者であるかどうかを確認します (他のユーザーを削除する権限を持っています)。おそらくそのアプローチは問題ありませんが、そのロジックを集約ルートに入れる必要があると感じています。:
- User.JoinEvent(Event) - いくつかのロジックに基づいて、渡された Event を User.Events コレクション (双方向) に追加できます。
- User.LeaveEvent(Event) - JoinEvent に似ています。
- User.RemoveUserFromEvent(User,Event) - CreatedEventsコレクションをUserに持つことができ、そのコレクションのEventに対してEvent.RemoveUser(User)を呼び出すことができます。このようにして、作成者だけが誰かをキックできるようになります。または
- Evet.RemoveUser(UserToRemove) - しかし、作成者によって呼び出されたことを確認するにはどうすればよいですか?
最初の2つのメソッドが(少なくとも私にとっては)問題ないように見える場合、3番目のメソッドはEvent.RemoveUser(イベントメンバーコレクションを管理するため)メソッドを作成し、 User.RemoveUserFromEventにあるロジックをバイパスするために使用できます。
だから、最後に私は2つの質問があります:
- このような 2 つの集計ルートが連携し、両方に存在するロジックによって 1 つの操作が決定されるような状況では、どのようなアプローチをとっていますか? 多分User.CanJoinEvent(Event)のようなある種の方法ですか?
- User.RemoveUserFromEventのような「危険」ポイントを作成するのはどうですか
多分誰かが私のためにそれについて少し光を当てることができます、すべての助けがいいでしょう.