Единица работы и L2S DataContext

Быстрый вопрос для экспертов по шаблонам.

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

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

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

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

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

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

Спасибо


person Duncan    schedule 21.06.2009    source источник


Ответы (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
person mvr    schedule 22.06.2009
comment
с этим подходом мало что не так. 1) Технология персистентности просочилась в домен с помощью DataContext (L2S). 2) DataContext можно использовать вне контекста репозитория, клиенты могут просто использовать DataContext для создания собственных запросов, поэтому репозиторий не нужен. - person ; 07.11.2009
comment
Контейнер IoC может решить обе эти проблемы. IUnitOfWork просто нужен метод SubmitChanges, что означает, что клиенты, которые его используют, не будут иметь доступа к контексту данных. Вы можете реализовать IUnitOfWork в частичном классе DataContext. Затем для репозиториев вместо этого они должны разрешаться из контейнера IoC через интерфейсы. Конкретные реализации этих репозиториев могут иметь конкретный класс DataContext, внедренный через их конструкторы. - person mvr; 09.11.2009