Да кажем, че имам общ интерфейс на хранилище, както следва:
public interface IRepository<T>
{
Add(T item);
Delete(int itemId);
Update(T item);
}
Обикновено новият идентификатор на елемент, добавен чрез IRepository.Add(), ще бъде определен от някаква бек-енд база данни, но само след като цялостната транзакция/единица работа бъде изпратена. Така че съм доста сигурен, че би било погрешно IRepository.Add() да върне новия идентификатор на добавения елемент. Хранилището наистина не трябва да знае нищо за това как се създава ID. Дали това е правилно?
Ако това е случаят, как иначе може да се определи новият идентификатор на елемент, добавен към хранилище, или дори трябва да правя това? Знам, че ORM като NHibernate е в състояние автоматично да замени обекти в паметта с нови обекти с правилния идентификатор, но се опитвам да проектирам моето хранилище, без да имам предвид никаква конкретна реализация на ORM.
Например, кажете, че имам уебсайт, където клиентите могат да правят поръчки. Нов клиент избира да провери и бива изпратен до формуляр, за да попълни своите данни. Тази информация се използва за създаване на обект Customer, който се съхранява в CustomerRepository. Сега информацията за тяхната поръчка трябва да бъде създадена, но поръчката трябва да препраща към клиент чрез неговия идентификатор?
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");