Patrón Unit of Work (UoW) o Unidad de Trabajo
Definición
Este patrón tiene como objetivo tratar como una Unidad todos aquellos objetos nuevos, modificados o eliminados con respecto de una fuente de datos.
Martin Fowler, ya realizó una descripción de UoW en su libro “Patterns of Enterprise Application Architecture”.
Aproximación
Una aproximación, similar a la que usa Fowler para definir el patrón, podría ser:
1: public class UnidadDeTrabajo
2: {
3:
4: List<cBase> objetosNuevos;
5: List<cBase> objetosModificados;
6: List<cBase> objetosEliminados;
7:
8: public UnidadDeTrabajo()
9: {
10: objetosNuevos = new List<cBase>();
11: objetosModificados = new List<cBase>();
12: objetosEliminados = new List<cBase>();
13: }
14:
15: public void Añadir(cBase newObj)
16: {
17:
18: }
19:
20: public void Eliminar(cBase delObj)
21: {
22:
23: }
24:
25: public void Modificar(cBase modObj)
26: {
27:
28: }
29: public void Confirmar()
30: {
31:
32: }
33:
34: private void Limpiar()
35: {
36: objetosNuevos.Clear();
37: objetosModificados.Clear();
38: objetosEliminados.Clear();
39: }
40: }
Dentro de la definición de la clase podemos encontrar lo siguiente:
- Declaración de las listas que van a contener los objetos Nuevos, Modificados y Eliminados.
- Métodos para agregar los elementos Nuevos, los elementos modificados y los que serán eliminados.
- Método “Confirmar” que será el encargado de enviar los cambios a la Base de Datos.
- Método limpiar para vaciar las listas.
Las definiciones de los métodos están vacías, falta la lógica donde se va a comprobar si se deben o no añadir a la lista indicada el objeto deseado.
En el ejemplo estoy utilizando el tipo “cBase” que digamos es la clase base de cada una de las entidades de mi negocio.
A la hora de Confirmar los cambios, se podrían realizar las comprobaciones pertinentes para determinar que los datos no han sido modificados o eliminados por otro Usuario.
Conclusiones
El patrón UoW nos va a resultar muy útil a la hora de persistir un conjunto de acciones a ejecutar sobre la base de datos, evitando el exceso de conexiones contra la misma.
Se puede utilizar con la potencia de Entity Framework, por lo que es algo muy a tener en cuenta.
Saludos!