最初に投稿の長さについて謝罪しますが、コメントで前後に時間をかけないように、できるだけ多くの詳細を前もって伝えたいと思いました。
DDDアプローチに従ってアプリケーションを設計していますが、集約ルートに別のARを含めるべきか、それとも独立した「独立した」ARとして残すべきかを判断するためにどのようなガイダンスに従うべきか疑問に思っています。
従業員がその日のために自分で出入りできる単純なタイムクロックアプリケーションの場合を考えてみましょう。UIを使用すると、従業員IDとPINを入力できます。これらは検証され、従業員の現在の状態が取得されます。従業員が現在出勤している場合、UIには「Clock Out」ボタンが表示されます。そして、逆に、彼らが出勤していない場合、ボタンには「Clock In」と表示されます。ボタンによって実行されるアクションは、従業員の状態にも対応しています。
アプリケーションは、RESTfulサービスインターフェイスを介して公開されるバックエンドサーバーを呼び出すWebクライアントです。直感的で読み取り可能なURLを作成する最初のパスの結果、次の2つのエンドポイントが作成されました。
http://myhost/employees/{id}/clockin
http://myhost/employees/{id}/clockout
注:これらは、従業員IDとPINが検証され、「ユーザー」を表す「トークン」がヘッダーで渡された後に使用されます。これは、マネージャーまたはスーパーバイザーが別の従業員に出勤または出勤できるようにする「マネージャーモード」があるためです。しかし、この議論のために、私はそれをシンプルにしようとしています。
サーバーには、APIを提供するApplicationServiceがあります。ClockInメソッドの最初のアイデアは次のようなものです。
public void ClockIn(String id)
{
var employee = EmployeeRepository.FindById(id);
if (employee == null) throw SomeException();
employee.ClockIn();
EmployeeRepository.Save();
}
これは、従業員のタイムカード情報がトランザクションのリストとして実際に維持されていることに気付くまで、非常に簡単です。つまり、ClockInまたはClockOutを呼び出すたびに、従業員の状態を直接変更するのではなく、従業員のタイムシートに新しいエントリを追加しています。従業員の現在の状態(出勤しているかどうか)は、タイムシートの最新のエントリから取得されます。
したがって、上記のコードを使用する場合、リポジトリは従業員の永続プロパティが変更されていないことを認識し、従業員のタイムシートに新しいエントリが追加されたことを認識し、データストアに挿入する必要があります。
一方(そして、ここに投稿の最終的な質問があります)、TimeSheetはAggregate Rootであり、アイデンティティ(従業員IDと期間)を持っているように見え、TimeSheet.ClockInと同じロジックを簡単に実装できます(従業員ID)。
私は2つのアプローチのメリットについて議論していることに気づき、冒頭の段落で述べたように、どのアプローチが問題により適しているかを判断するためにどの基準を評価すべきか疑問に思います。