顧客と注文明細を関連付けるOrderタイプの集約ルートエンティティがあるとします。注文エンティティについて考えるとき、IDなしで定義されていないものとして概念化する方が自然です。IDのない注文は、注文よりも注文リクエストとして表現する方が適切なようです。
リポジトリに注文を追加するために、私は通常、IDなしで注文をインスタンス化してから、リポジトリにオブジェクトを完成させるのを目にします。
class OrderRepository
{
void Add(Order order)
{
// Insert order into db and populate Id of new order
}
}
このアプローチで私が気に入っているのは、OrderインスタンスをOrderRepositoryに追加していることです。それは非常に理にかなっています。ただし、注文インスタンスにはIDがなく、リポジトリのコンシューマーの範囲では、注文にIDがないことは私には意味がありません。OrderRequestをorderのインスタンスとして定義し、それをリポジトリに追加することもできますが、それはオレンジからリンゴを派生させて、それをオレンジのリストに追加するようなものです。
あるいは、私はこのアプローチも見ました:
class OrderRepository
{
Order AddOrder(Customer customer)
// It might be better to call this CreateOrder
{
// Insert record into db and return a new instance of Order
}
}
このアプローチで私が気に入っているのは、IDがないと順序が定義されていないことです。リポジトリは、注文のインスタンスを作成して返す前に、データベースレコードを作成し、すべての必須フィールドを収集できます。ここで臭いがするのは、実際に注文のインスタンスをリポジトリに追加することは決してないという事実です。
どちらの方法でも機能するので、私の質問は次のとおりです。これら2つの解釈のいずれかを使用する必要がありますか、それとも挿入をモデル化するためのベストプラクティスがありますか?
私はこの答えが似ていることを発見しましたが、値オブジェクトの場合: 集約ルートによって維持されているコレクションにオブジェクトを追加するにはどうすればよいですか?値オブジェクトに関しては混乱はありませんが、私の質問は、外部ソース(自動生成されたデータベースID)から派生したIDを持つエンティティに関するものです。