マイクロサービスのコンテキストでこの質問を再確認したいと思います。これは元の質問からの引用です。
私は現在プロジェクトのREST-APIを作成しており、ベストプラクティスに関する記事を読んでいます。多くの人はDTOに反対していて、単にドメインモデルを公開しているようですが、他の人はDTO(またはユーザーモデルなど、呼び出したいもの)は悪い習慣だと考えているようです。個人的には、この記事は非常に理にかなっていると思いました。
ただし、すべての追加のマッピングコード、DTOの対応物と100%同一である可能性があるドメインモデルなど、DTOの欠点も理解しています。
アプリケーションのすべてのレイヤーで1つのオブジェクトを使用するように調整しています(つまり、DTOを作成して各フィールドを手動でコピーするのではなく、ドメインオブジェクトを公開するだけです)。そして、私の契約とコードの違いは、_@JsonIgnore
_または@JsonProperty(access = Access.WRITE_ONLY)
または_@JsonView
_などのようなJacksonアノテーションを使用して対処できます。または、Jackson Annotationを使用して実行できない変換が必要なフィールドが1つまたは2つある場合は、それを処理するカスタムロジックを記述します(信じてください、このシナリオに遭遇したのは5年以上も一度もありません)休息サービスでの長い旅)
ドメインをDTOにコピーしないことによる実際の悪影響がないかどうかを知りたい
mybatis.configuration.map-underscore-to-camel-case: true
、spring.jackson.property-naming-strategy: SNAKE_CASE
などのアプリケーション全体のプロパティを使用することで回避できます短編、少なくとも私の場合、短所は長所を上回らないので、新しいPOJOをDTOとして持つことによって自分自身を繰り返すことは意味がありません。コードが少ないほど、バグの可能性が低くなります。したがって、ドメインオブジェクトを公開し、個別の「ビュー」オブジェクトを持たないことを進めます。
免責事項:これは、ユースケースに適用できる場合と適用できない場合があります。この観察は私のユースケースごとです(基本的には15個のエンドポイントを持つCRUD API)
私はDTOの使用に投票し、ここに理由があります。
次の理由により、CQRSを使用する場合の決定ははるかに簡単です。
Commands
を使用します。 Aggregates
-ドメインレイヤーの豊富な動作オブジェクト-公開/照会されないため、問題はありません。readmodel
を使用できるため、マッピングの問題はありません。最悪の場合、GraphQLなどを使用して、必要なフィールドのみを選択できます。読み取りと書き込みを分割しない場合、どちらのソリューションにもトレードオフがあるため、決定は難しくなります。