Скажем, у меня есть общий интерфейс хранилища следующим образом:
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");