次のような一般的なリポジトリ インターフェイスがあるとします。
public interface IRepository<T>
{
Add(T item);
Delete(int itemId);
Update(T item);
}
通常、IRepository.Add() を介して追加されたアイテムの新しい ID は、何らかのバックエンド データベースによって決定されますが、トランザクション全体または作業単位が送信された後にのみ決定されます。したがって、追加されたアイテムの新しい ID を IRepository.Add() が返すのは間違っていると確信しています。リポジトリは、ID がどのように作成されるかについて、実際には何も認識すべきではありません。これは正しいです?
この場合、リポジトリに追加されたアイテムの新しい ID を他にどのように判断できますか、またはこれを行う必要がありますか? NHibernate のような ORM は、メモリ内のオブジェクトを正しい ID を持つ新しいオブジェクトに自動的に置き換えることができることを知っていますが、特定の ORM 実装を念頭に置いてリポジトリを設計しようとしています。
たとえば、顧客が注文できる Web サイトがあるとします。新しい顧客がチェックアウトを選択すると、詳細を入力するフォームに送信されます。この情報は、CustomerRepository に格納される Customer オブジェクトを作成するために使用されます。注文情報を作成する必要がありますが、注文は ID で顧客を参照する必要がありますか?
Customer newCustomer = new Customer(first, last, address, phone dateOfBirth);
customerRepository.Add(newCustomer);
//How would I determine customerId??
Order newOrder = new Order(customerId, shippingAddress, billingAddress);
newOrder.AddOrderItem("widget");
newOrder.AddOrderItem("doohicky");
newOrder.AddOrderItem("stuff");