La respuesta corta sería que el Repositorio estaría utilizando la UoW de alguna manera, pero creo que la relación entre estos patrones es menos concreta de lo que inicialmente parecería. El objetivo de la Unidad de trabajo es crear una forma de agrupar esencialmente un grupo de funciones relacionadas con la base de datos para que puedan ejecutarse como una unidad atómica.A menudo hay una relación entre los límites creados al usar UoW y los límites creados por las transacciones, pero esta relación es más coincidencia.
El patrón Repositorio, por otro lado, es una forma de crear una abstracción que se asemeja a una colección sobre una raíz agregada. La mayoría de las veces, los tipos de cosas que se ven en un repositorio están relacionadas con la consulta o la búsqueda de instancias de la raíz agregada. Una pregunta más interesante (y que no tiene una sola respuesta) es si tiene sentido agregar métodos que se ocupen de algo que no sea la consulta de Agregados. Por un lado, podría haber algunos casos válidos en los que tenga operaciones que se aplicarían a múltiples agregados. Por otro lado, podría argumentarse que si está realizando operaciones en más de un Agregado, en realidad está realizando una sola acción en otro Agregado. Si solo está consultando datos, no sé si realmente necesita crear los límites implícitos en la UoW. Todo se reduce al dominio y cómo se modela.
Los dos patrones se tratan a niveles de abstracción muy diferentes, y la participación de la Unidad de trabajo dependerá de cómo se modelen los Agregados. Los Agregados pueden querer delegar el trabajo relacionado con la persistencia a las Entidades que administran, o podría haber otra capa de abstracción entre los Agregados y el ORM real. Si sus Agregados/Entidades se ocupan de la persistencia ellos mismos, entonces puede ser apropiado que los Repositorios también administren esa persistencia. Si no, entonces no tiene sentido incluir UoW en su repositorio.
Si desea crear algo para el consumo público general fuera de su organización, entonces le sugiero que cree sus interfaces/implementaciones de base Repository de una manera que les permita interactuar directamente con su ORM o no dependiendo de la necesidades del usuario de su ORM. Si esto es interno, y estás haciendo el trabajo de persistencia en tus Aggregates.Entidades, entonces tiene sentido que tu Repositorio haga uso de tu UoW. Para un Repositorio genérico, tendría sentido proporcionar acceso al objeto UoW desde las implementaciones del Repositorio que pueden asegurar que se inicialice y elimine de forma adecuada. En ese sentido, también habrá momentos en los que probablemente desee utilizar varios repositorios dentro de lo que sería un único límite de UoW, por lo que le gustaría poder pasar un UoW ya preparado al depósito en ese caso.
Simplemente curioso, ¿por qué construir ORM cuando hay varios buenos por ahí? –
Solo intento aplicar las mejores prácticas de ORM a PHP. Ya hay algunos, pero no coinciden exactamente con mis expectativas. – Benjamin
+1 Buena pregunta. – Nilesh