Скажем, у меня есть общий интерфейс репозитория следующим образом:
public interface IRepository<T>
{
Add(T item);
Delete(int itemId);
Update(T item);
}
Обычно новый идентификатор элемента, добавленного через IRepository.Add (), будет определяться некоторой внутренней базой данных, но только после того, как будет отправлена общая транзакция / единица работы. Поэтому я совершенно уверен, что IRepository.Add () будет неправильно возвращать новый идентификатор добавленного элемента. Репозиторий действительно не должен ничего знать о том, как создаются идентификаторы. Это верно?
Если это так, как еще можно определить новый идентификатор элемента, добавленного в репозиторий, или мне даже следует это делать? Я знаю, что 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");