Pregunta

Quick Q para sus expertos en patrones.

Quiero un patrón de repositorio que esté desacoplado de la tecnología de acceso a datos real, ya que aún no lo he decidido y quiero que sea flexible. Entonces, esto podría ser L2S, L2E, NHibernate, Lightspeed o cualquier cosa.

Pero me estoy confundiendo acerca de esta cosa de UnitOfWork.

En el mundo L2S, este parece ser su DataContext.

Pero qué pasa con un mundo que no es L2S, imagina que estaba usando SQL escrito a mano, por ejemplo.

Mi pregunta es quién hace qué. En mi método Repo.Save (), ¿debería esto llamar a UnitOfWork.Commit que luego genera el INSERT / UPDATE SQL requerido?

¡No espero una respuesta definitiva, pero alguna discusión sería buena, solo para asegurarme de que estoy en el camino correcto!

Gracias

¿Fue útil?

Solución

Los repositorios ciertamente pueden llamar a commit / save / submit en la unidad de objeto de trabajo, o podrían dejar esto al consumidor. Prefiero el último escenario, ya que permite al consumidor controlar la vida útil de la instancia de la unidad de trabajo, lo que permite al consumidor involucrar múltiples repositorios:

// 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top