1

基本的に、私のアプリは、ログインして何かを投稿するstackoverflowのように動作し、他の人が来て、やり取りします。アプリケーションアーキテクチャ - User.CreatePost(Post)またはPostsService.CreatePost(Post、User)?

DDDの条件で考えると、貧血のモデルを避けるためにしようとは、私は今、この決断に直面している:私のUserエンティティが+任意のポスト更新を作成するために必要な知識は+が彼の投稿を検索するか、私はフォールバックする必要があり、削除を保持すべき古いパターンには、PostDTOUserDTO参照を取得し、すべてを行う「投稿ビジネスサービス」がありますか?

詳細:
-Iメインページがリストにすべての記事が必要になりますので、私は、ポストサービスのいくつかの種類が必要になりますし、管理者ユーザーが任意の投稿を削除することができると信じている...
-Ideally、 Userエンティティ(およびそれを継承する他のエンティティ)のみが投稿を作成できるはず
- 私は承認をどのように処理するか分かりません(ブロックスパマーやその他のものと考える)
- これはドメインサービスがトリガーされている必要があります〜によってUser.CreatePost(postDTO)

答えて

5

DDDまたはCRUD?

はちょうどあなたの質問の一部呼び出すと思った:

を任意のポスト更新を作成+削除+

を取得これはおそらく、DDDは、このシステムの正しい答えではないことが明らかになりました。コア要件が作成、読み取り、更新、削除であるシステムは、DDDのアプローチでは呼び出されません。実際、DDDはあなたの成功した実装を妨げる可能性があります。基本的なCRUDシステムはあなたの人生を楽にするでしょう。

DDDはドメイン言語のことを考えてみたいときです。ユーザーは「投稿を作成する」、「質問をする」、「回答する質問」をしません。管理者は「投稿をアーカイブ」しないでください。

「質問する」という技術的な実装では、最終的にデータベースレコードが「作成」される可能性がありますが、目的は永続レイヤーにプッシュし、ドメインを完全にドメイン "ユビキタス言語"。あなたはDDDを進めていると仮定すると、

明示的な役割のアプローチ

、このような状況を検討する際に有用である私が使用している一つのパターンは、質問と回答のあなたのコアドメインを検討する際に非常に抽象的Userエンティティを避けるためです。

Userエンティティは、認証/サインインの詳細を追跡している管理対象のコンテキストであるIdentityの場合は問題ありません。しかし、一度あなたのコアドメインを調査すると、一般的にユーザは特定の役割を果たすシステムに従事しているので、一般的なUserより具体的で具体的です。例えばあなたは質問をしている人と答えている人を検討しています。おそらく、モデレーターであるユーザー、または管理者であるユーザーもいます。

これらのタイプのユーザーのそれぞれは、さまざまなタイプのアクティビティを実行します。したがって、時にはこれらのロールを明示的にモデル化すると便利です。 Posterエンティティと、Moderatorエンティティと、Administratorエンティティとを含む。

あなたは非常に多くの場合、ユーザーの役割がモデルに具現化する必要はありませんので、私は時々を強調Poster.AskQuestionPoster.AnswerQuestionModerator.Moderateなど

を持つことができます - 役割はのほんの一部でありますアクセス制御/認可レイヤーであり、モデルは、現在のユーザーが許可されていると仮定して動作することができます。

おそらくあなたの場合のキーエンティティはメソッドを持つMessageBoardです。

ただし、投稿に関連付けられたユーザーがドメインの中心的な部分である可能性があります。質問や回答の習慣の一環として、ユーザーのその他の行動を促しているかもしれません。ステータスを変更したり、バッジなどを追加することができます。

+0

最初にCRUD部分をオーバーライドしました... 秒:ユーザーを表現するさまざまなエンティティが直感的ではありません...私は、ポスター、モデレータ、管理者は基本的に異なる操作を実行できるユーザーだと思います。しかし、 'PromoteToModerator(poster)'メソッドを一般的なIUserではなくadminにのみマップし、許可されていない例外をスローするのは意味があります... 3番目: 'messageBoard.AddPost'が正しいとは思わないなぜなら私はユーザーがボードにポストを "ピン止め"し、それ以外の方法では(ボードがユーザーにポストを結び付ける)と思うからです...そうですか? – Leonardo

+0

興味深いことに、http://blog.sapiensworks.com/post/2016/07/14/DDD-Aggregate-Decoded-3では、ARはロールであり、あなたのアプローチにきちんと適合しています... – Leonardo

+0

私はブログの投稿が使用していると思います私の答えとは異なる言葉で 'ロール'という言葉。彼らは、ARの目的が機能を実行すること(すなわち、システム内で果たす役割を担うこと)であることについて話している - この場合、彼らのARは状態を持たないという事実を正当化するために、純粋な関数であり、クラスではありません。 –