2009-06-21 6 views
0

Quick Q для вас, специалисты по дизайну.Единица работы и L2S DataContext

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

Но я смущаюсь об этой вещи UnitOfWork.

В мире L2S это, кажется, ваш DataContext.

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

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

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

Благодаря

ответ

1

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

// 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 
+0

Некоторые вещи не соответствуют этому подходу. 1) Технология persistence просочилась в домен с помощью DataContext (L2S). 2) DataContext можно использовать вне контекста репозитория, клиенты могут просто использовать DataContext для генерации собственных запросов, поэтому нет необходимости в репозитории. – 2009-11-07 05:57:49

+1

Контейнер IoC может решить обе эти проблемы. IUnitOfWork просто нужен метод SubmitChanges, что означает, что клиенты, которые его используют, не будут иметь доступ к контексту данных. Вы можете реализовать IUnitOfWork в частичном классе DataContext. Затем для репозиториев они должны быть разрешены из контейнера IoC через интерфейсы. Конкретные реализации этих репозиториев могут иметь конкретный класс DataContext, вводимый через их конструкторы. – mvr

 Смежные вопросы

  • Нет связанных вопросов^_^