说我有一个通用的库接口如下:如何确定添加到存储库的聚合根的标识号?
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");
在我看到的例子中,存储库并不像您所描述的那样提交更改。而是每个存储库引用一个可以提交或回滚的UnitOfWork对象。不过,我的印象是,UnitOfWork对象通常是安装的,因此它只能回滚尚未提交的更改。 – 2011-06-08 23:16:55