NestJSのドキュメントには、コントローラーで使用するDTOを追加して、class-validatorパッケージを使用してリクエストオブジェクトを検証する方法が示されています。そこで説明されているDTOにはTypeScriptクラスがあります。現在、コントローラーはDTO(TSクラス)を処理していますが、NestJSプロバイダー(またはサービス)はTypeScriptインターフェースを使用しています。これらのDTOとインターフェースは、ほとんど同じ形です。
ここで、形状定義の重複がここにあります。そして、インターフェースがまったく必要かどうか疑問に思いますか?
形状と検証のDTOを真実のソースにすることはできませんか? (真実のDTOソースを作成するために)私たちが検討していたアプローチの1つは、openapiジェネレーターが入力としてDTOを受け取り、openapi定義を生成し、そこから別のcodegenがNestJS自体が使用するTypeScriptインターフェイスのセットを生成できるようにすることでしたAngularのような他のコンシューマアプリケーションセットと共有することもできます。
同様の問題に遭遇した人はいますか?上記についてどう思いますか。フィードバックを歓迎します。
DTO
が何であるかを知ることは重要だと思います。
DTO(Data Transfer Object)
はJava(J2EE)
デザインのコンセプトです。
それは通常のJava Bean
オブジェクトのように見えます。これは、バックエンド、特にDistributed Systems
で、複数のレイヤー(controller
、service
、database
など)を介してデータオブジェクトを転送するために作成されました。
DTO
モデルなし
必要なデータをクエリするために大量のリクエストを送信しますが、それらは重複する場合があります。
Application -> WebService -> Database
database
からオブジェクト全体を返します。ところで、それを制限するためにいくつかの追加のコードを手動で追加する必要があります。DTO
モデルを使用
データオブジェクトを処理するのに役立ちます。
NestJS
のガイドでは、DTO
はHTTP Request
本体のように機能します。
私の意見では、DTO
には以下が含まれます:
Database
では使用しないもの。およびDTO
マスク:
class-validator
で使用する場合、DTO
を使用すると、エレガントな方法でデータを検証することもできます。
オブジェクトinterface
と同じように見える場合があります。
データベースコレクションが巨大で複雑な場合、DTO
が重要になると思います。
私は専門家ではありませんが、DTOをまったく使用していません。私は本当にそれらの使用法を見ることができませんでした。各モジュールには、サービス、モジュール、エンティティ、コントローラがあります。
DTO
の概念とその役割に関する@Victorの回答を拡張するために、interfaces
を使用して、アプリで意味のある何かを表すコントラクトを設定できるようにしたいと思います。次に、このコントラクトを必要に応じて他の場所で実装または拡張できますたとえば、データベースオブジェクトのエンティティ定義-DAO
s、データ転送オブジェクト-DTO
s、およびビジネスモデル定義特に。
また、interfaces
のDTO
sをバックエンドとフロントエンドで共有できるため、両方のプロジェクトで、コードの重複やオブジェクトの交換によるオブジェクトの違いを回避して、開発と保守が容易になります。