Единица работы и L2S DataContext - PullRequest
0 голосов
/ 21 июня 2009

Quick Q для вас экспертов по шаблону.

Мне нужен шаблон репозитория, который не связан с реальной технологией доступа к данным, так как я еще не определился с этим и хочу, чтобы он был гибким. Таким образом, это может быть L2S, L2E, NHibernate, Lightspeed или что-то еще.

Но я запутался в этой штуке с UnitOfWork.

В мире L2S это, похоже, ваш DataContext.

Но что касается мира, не относящегося к L2S, представьте, что я использовал, например, рукописный SQL.

Мой вопрос: кто чем занимается? В моем методе Repo.Save () должен ли он вызывать UnitOfWork.Commit, который затем генерирует необходимый SQL INSERT / UPDATE?

Не ожидая определенного ответа, но некоторые обсуждения были бы хорошими, просто чтобы убедиться, что я на правильном пути!

Спасибо

1 Ответ

1 голос
/ 22 июня 2009

Хранилища, безусловно, могут вызывать commit / save / submit для объекта единицы работы или могут оставить это на усмотрение потребителя. Я предпочитаю последний сценарий, поскольку он позволяет потребителю контролировать время жизни экземпляра единицы работы, что позволяет потребителю задействовать несколько хранилищ:

// outside the repository layer
// int productId defined elsewhere
// int quantity defined elsewhere

IUnitOfWork unitOfWork = ... instantiate/get a new instance of your DataContext ...

ProductRepository productRepository = new ProductRepository(unitOfWork);
Product product = productRepository.GetById(productId);

Order order = new Order();
order.AddOrderLine(product, quantity);

OrderRepository orderRepository = new OrderRepository(unitOfWork);
orderRepository.Add(order);

unitOfWork.Save(); // This calls SubmitChanges() on the DataContext
...