DDDまたはCRUD?
はちょうどあなたの質問の一部呼び出すと思った:
を任意のポスト更新を作成+削除+
を取得これはおそらく、DDDは、このシステムの正しい答えではないことが明らかになりました。コア要件が作成、読み取り、更新、削除であるシステムは、DDDのアプローチでは呼び出されません。実際、DDDはあなたの成功した実装を妨げる可能性があります。基本的なCRUDシステムはあなたの人生を楽にするでしょう。
DDDはドメイン言語のことを考えてみたいときです。ユーザーは「投稿を作成する」、「質問をする」、「回答する質問」をしません。管理者は「投稿をアーカイブ」しないでください。
「質問する」という技術的な実装では、最終的にデータベースレコードが「作成」される可能性がありますが、目的は永続レイヤーにプッシュし、ドメインを完全にドメイン "ユビキタス言語"。あなたはDDDを進めていると仮定すると、
明示的な役割のアプローチ
、このような状況を検討する際に有用である私が使用している一つのパターンは、質問と回答のあなたのコアドメインを検討する際に非常に抽象的User
エンティティを避けるためです。
User
エンティティは、認証/サインインの詳細を追跡している管理対象のコンテキストであるIdentity
の場合は問題ありません。しかし、一度あなたのコアドメインを調査すると、一般的にユーザは特定の役割を果たすシステムに従事しているので、一般的なUser
より具体的で具体的です。例えばあなたは質問をしている人と答えている人を検討しています。おそらく、モデレーターであるユーザー、または管理者であるユーザーもいます。
これらのタイプのユーザーのそれぞれは、さまざまなタイプのアクティビティを実行します。したがって、時にはこれらのロールを明示的にモデル化すると便利です。 Poster
エンティティと、Moderator
エンティティと、Administrator
エンティティとを含む。
あなたは非常に多くの場合、ユーザーの役割はがモデルに具現化する必要はありませんので、私は時々を強調Poster.AskQuestion
、Poster.AnswerQuestion
、Moderator.Moderate
など
を持つことができます - 役割はのほんの一部でありますアクセス制御/認可レイヤーであり、モデルは、現在のユーザーが許可されていると仮定して動作することができます。
おそらくあなたの場合のキーエンティティはメソッドを持つMessageBoard
です。
ただし、投稿に関連付けられたユーザーがドメインの中心的な部分である可能性があります。質問や回答の習慣の一環として、ユーザーのその他の行動を促しているかもしれません。ステータスを変更したり、バッジなどを追加することができます。
最初にCRUD部分をオーバーライドしました... 秒:ユーザーを表現するさまざまなエンティティが直感的ではありません...私は、ポスター、モデレータ、管理者は基本的に異なる操作を実行できるユーザーだと思います。しかし、 'PromoteToModerator(poster)'メソッドを一般的なIUserではなくadminにのみマップし、許可されていない例外をスローするのは意味があります... 3番目: 'messageBoard.AddPost'が正しいとは思わないなぜなら私はユーザーがボードにポストを "ピン止め"し、それ以外の方法では(ボードがユーザーにポストを結び付ける)と思うからです...そうですか? – Leonardo
興味深いことに、http://blog.sapiensworks.com/post/2016/07/14/DDD-Aggregate-Decoded-3では、ARはロールであり、あなたのアプローチにきちんと適合しています... – Leonardo
私はブログの投稿が使用していると思います私の答えとは異なる言葉で 'ロール'という言葉。彼らは、ARの目的が機能を実行すること(すなわち、システム内で果たす役割を担うこと)であることについて話している - この場合、彼らのARは状態を持たないという事実を正当化するために、純粋な関数であり、クラスではありません。 –