1

プロジェクトのドメイン オブジェクトを設計するための最良の方法を知りたいです。

ドメイン オブジェクトは、ORM/フレームワーク、さらにはデータベース テクノロジ (MySQL、MSSQL、さらには Mongo) についても知らない必要があります。

そして、次の質問が頭に浮かびます。Post と Comment という 2 つのオブジェクトがあるとしましょう。

これは Post オブジェクトのコードです:

class Post {
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public IList<Comment> Comments { get; set; }
}

ここで、Comment オブジェクトに関する私の質問は、それが Post ID を含むべきか、それとも Post オブジェクトだけを含むべきかということです。

class Comment {
    public int Id { get; set; }
    public string Content { get; set; }
    public Post Post { get; set; }

    public int PostId { get; set; } // Should i include it?
}

リレーショナル オブジェクトまたはそのドメイン オブジェクトの Id を含めることは良い方法ですか?

もう 1 つの懸念は、mongodb のような SQL データベースがないことです。データを mongodb に保存した場合、Comment オブジェクトはどの Post オブジェクトを参照しますか? mongodb では、投稿とコメントの間に関係はありません。投稿にはコメントのリストが含まれますが、コメント自体は、それらが含まれる投稿を認識しません。これらのドメイン クラスを Sql ベースのデータベースと NoSql データベースの両方と互換性を持たせるにはどうすればよいでしょうか?

ありがとうございました

4

2 に答える 2

1

オブジェクト指向設計

PostCommentのクラスは、両方が相互に参照するように設計されています。絶対に必要でない限り、この密結合を回避しようとしComment.PostIdますが、確実に時代遅れになりPost.IdますComment

また、ドメイン オブジェクトはおそらく不変条件を保護しようとするはずです。現在持っているのはプロパティ バッグ (パブリック セッターを使用した場合でも) であり、ドメイン オブジェクトではないため、現在のところ、永続化に使用するオブジェクトに比べて意味のある利点はありません。

したがって、ドメイン モデルを作成する場合は、次のような質問を自問してください。

  • 私が構築しているシステムで、アクターは投稿に対して何ができますか?
  • アクターが取得できるコメントのデータは?

次に、ビジネス ケースをサポートする方法でドメイン オブジェクトをモデル化します。たとえば、アプリケーションのユーザーが投稿のタイトルを変更することを禁止されている場合は、setter を から削除する必要がありますPost.Title

この回答は、ドメイン駆動設計のコンテキストにある場合でも、ドメイン オブジェクトと単純なプロパティ バッグ (別名 POCO) の違いに関する詳細情報を提供する場合があります。

ドキュメント DB の永続性

これらのオブジェクトをドキュメント指向の DB に格納するには、基本的に次の 2 つの選択肢があります。

  • それらを別々のドキュメントとして保存し、相互に参照します
  • コメントを投稿の一部として投稿ドキュメントに保存する

どちらも有効なアプローチです。アプリケーションを決定する必要があります。ただし、ドキュメントの境界は一貫性の境界でもあることに注意してください。したがって、投稿とそのコメントに対してアトミック操作が必要な場合、唯一のオプションはそれらを同じドキュメントに配置することです。

于 2015-08-31T08:46:06.080 に答える