ほとんどすべての状況で、主キーはビジネスドメインの一部ではありません。確かに、一意のインデックスを持つユーザー向けの重要なオブジェクト(UserName
ユーザーまたはOrderNumber
注文用)がいくつかある場合もありますが、ほとんどの場合、1つまたは複数の値によってドメインオブジェクトを明確に識別する必要はありません管理ユーザー。これらの例外的な場合でも、特にグローバル一意識別子(GUID)を使用している場合は、主キー自体を公開するのではなく、代替キーを使用したい、または使用したいでしょう。
したがって、ドメイン駆動型設計の私の理解が正確である場合、主キーを公開する必要はなく、したがって公開すべきではありません。彼らはくて、私のスタイルをcr屈にします。しかし、ドメインモデルに主キーを含めないことを選択した場合、結果が生じます。
- 単純に、ドメインモデルの組み合わせから排他的に派生するデータ転送オブジェクト(DTO)には主キーがありません
- 着信DTOには主キーはありません
したがって、ドメインモデルで本当に純粋でプライマリキーを削除する場合、そのプライマリキーの一意のインデックスに関してすべての要求を処理できるように準備する必要があると言っても安全ですか?
別の言い方をすれば、ドメインモデルでPKを削除した後に特定のオブジェクトを識別するための正しいアプローチは、次のソリューションのどれですか
- 他の属性で処理する必要があるオブジェクトを識別できること
- DTOで主キーを取得します。つまり、永続性からドメインへのマッピング時にPKを削除し、ドメインからDTOへのマッピング時にPKを再結合しますか?
編集:これを具体的にしましょう。
私のドメインモデルがあると言うVoIPProvider
などの分野が含まれName
、Description
、URL
、などのような参照ProviderType
、PhysicalAddress
およびを、Transactions
。
ここで、特権ユーザーがVoIPProvider
s を管理できるWebサービスを構築したいとします。
おそらく、この場合、ユーザーフレンドリーなIDは役に立ちません。結局のところ、VoIPプロバイダーは、コンピューターの意味で名前が明確になり、ビジネス上の理由から人間の意味でも十分に区別される傾向がある企業です。それで、ユニークVoIPProvider
は完全に決定されると言うことで十分かもしれません(Name, URL)
。PUT api/providers/voip
特権ユーザーがVoIP
プロバイダーを更新できるようにする方法が必要だとしましょう。は、を送信しますVoIPProviderDTO
。これには、からのすべてのフィールドではなく、多くのフィールドが含まれVoIPProvider
ます。しかし、私は彼らの心を読むことができず、彼らはまだ私たちが話しているプロバイダーを教えてくれる必要があります。
私は2つ(おそらく3つ)のオプションを持っているようです:
- ドメインモデルにプライマリキーまたは代替キーを含めてDTOに送信します。逆も同様です。
- 次のような一意のインデックスを使用して、関心のあるプロバイダーを特定します。
(Name, Url)
- 永続層に関する実装の詳細を公開しない方法で、永続層、ドメイン、およびDTOの間を常にマッピングできる何らかの中間オブジェクトを導入します。たとえば、ドメインからDTOに移動するときにメモリ内の一時識別子を導入し、