假设我有一个通用存储库接口,如下所示:
public interface IRepository<T>
{
Add(T item);
Delete(int itemId);
Update(T item);
}
通常,通过 IRepository.Add() 添加的项目的新 ID 将由某个后端数据库确定,但仅在提交整个事务/工作单元后才确定。所以我相当肯定 IRepository.Add() 返回添加项目的新 ID 是错误的。存储库真的不应该知道 ID 是如何创建的。这个对吗?
如果是这种情况,如何确定添加到存储库的项目的新 ID,或者我什至应该这样做?我知道像 NHibernate 这样的 ORM 能够自动用具有正确 ID 的新对象替换内存中的对象,但我正在尝试设计我的存储库而没有考虑任何特定的 ORM 实现。
例如,假设我有一个客户可以在其中下订单的网站。一位新客户选择结帐并被发送到一个表格以填写他们的详细信息。此信息用于创建存储在 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");