2

ドメイン駆動設計について質問があります。簡単なシナリオを想像してみましょう。

いくつかのプロパティを持つ「ユーザー」というエンティティがあります。これらのプロパティの 1 つは、"date_created"、"date_modified"、および "last_login_ip" です。

ユーザーを作成するフォームがあり、作成が成功すると、ユーザーを認証するとします。

  1. コントローラは POST データを取得します
  2. 「createAndAuthenticateUser」メソッドを介して投稿データを UsersService に送信します
  3. サービスはデータを受け取り、それを検証します (電子メールが既に存在するかどうかを検証するなど、検証はリポジトリに関連付けられているため、エンティティではなくここで行います)。
  4. 検証が OK の場合、新しいエンティティを作成し、それにデータを割り当ててから、エンティティをリポジトリに送信して保存します。その後、リポジトリはこのユーザーをデータソースに保存します。

ここまでは順調ですね。ここでの問題は、このサービス メソッドで date_created/date_modified/last_login_ip を設定する必要があることです。

ユーザー オブジェクトが更新されたときにいつでも date_modified を設定したい場合はどうすればよいでしょうか (たとえば、ログイン時に date_modified を更新したい、ユーザー更新時にもう一度更新したい、ユーザー作成時にもう一度更新したいなど)。

論理的には、私自身の答えは、これを次のようにリポジトリに配置することです...

(ここではメタコードのようなもので、構文は関係ありません)

function save($User) {

if (!$User->id) $User->date_created = 'YYYY-MM-DD HH:II:SS';

$User->date_modified = 'YYYY-MM-DD HH:II:SS';

$DataSource->Save($User);

return $User;
}

ただし、私が読んだことから、リポジトリは常に呼び出し元とデータソースの間でデータをマップする必要があります (およびその逆)、それだけです。SET データなどは絶対に使用しないでください。

もちろん、これはビヘイビアであると言うことができるので、date_modified プロパティを設定するだけの $User->markAsUpdated() というビヘイビアを持つことができます。しかし、繰り返しになりますが、これは、このメソッドを一元的に呼び出すのではなく、複数の場所から呼び出す必要があることを意味します。このコードがリポジトリにないことの利点はわかりません。

何か案は?

4

1 に答える 1

0

最終ログインIPの概念が何らかの理由で実際にユーザーの中心にある場合、ログイン時にユーザーを更新することは有効です. 最後のログイン IP を保存するためにその更新を実行することについて懸念を表明しているという事実は、それが実際にはユーザーの概念ではなく、セキュリティ、監査、またはユーザーにとって外部の概念であることを意味します。

変更日と作成日を設定することに関しては、同じ議論をします。ユーザーがその情報を維持および公開することがシステムの要件である場合は、状態を変更するときに各パブリック メソッドが呼び出すプライベート メソッドをユーザーに作成します。これにより、変更日が設定されます。そうでない場合は、ほぼ 2 つのオプションがあります。更新の通知を受けて独自の監査レコードを保持する監査サービスを作成するか、レコードを更新するときにリポジトリにフィールドを設定させるかです。

于 2012-08-01T13:41:20.013 に答える