2011-11-15 24 views
5

lo que sería un mejor enfoque para un repositorio basado en xml:XML Repository; a Save() o no guardar()

1) Guardar los cambios en el documento XML subyacente en cada llamada al repositorio ...

public class XmlRepository1 
{ 
    private XDocument xDocument; 

    public void CrudOp() 
    { 
     // Perform CRUD operation... 

     // Call Save() 
     xDocument.Save(path); 
    } 
} 

o

2) Proporcionar al usuario final con un método SaveChanges() ...

public class XmlRepository2 
{ 
    private XDocument xDocument; 

    public void CrudOp() 
    { 
     // Perform CRUD operation... 

     // DON'T call save 
    } 

    // Provide a SaveChanges() method to the end-user... 
    public void SaveChanges() 
    { 
     xDocument.Save(path); 
    } 
} 

Mi inclinación se inclina hacia la opción 1, porque proporcionar un método SaveChanges() realmente no parece una responsabilidad de los repositorios. Sin embargo, estoy cuestionando esta decisión por un par de razones:

a) En un entorno de subprocesos múltiples, esto le brinda al usuario final una manera fácil de deshacer los cambios si falla una llamada al repositorio , dejando objetos en un estado parcialmente mutado.

b) La opción 2 proporciona un paradigma "por lotes", que puedo ver como más flexible por diversas razones.

+2

Como comentario a (a), nunca debe dejar su repositorio en un estado parcialmente mutado, sin importar lo que haya sucedido. –

+0

@Matthew -Déjame aclarar ... El repositorio no dejará objetos parcialmente mutados. Pero si un usuario final cambia el estado de un objeto, llama a Repository.Update (obj) y la llamada falla ... (¿Ve a dónde voy con esto?) Podría ser demasiado paranoico aquí, realmente no lo hago 't saber ... – Didaxis

Respuesta

3

Considere la posibilidad de agregar algún tipo de soporte de transacción (cerca de su segundo nombre).

public class XmlRepository2 
    { 
    public void CrudOp() 
    { 
     // DON'T call save 
    } 

    public MakeTransacedChanges(Action<XmlRepository2> makeChanges) 
    { 
     try{ 
      makeChanges(this); 
      saveChanges(); 
     } 
     catch (RepositoryException e) 
     { 
      //revert changes 
     } 
    } 

    private void saveChanges() 
    { 
     xDocument.Save(path); 
    } 
    } 
+0

+ 1 Después de revisar las cosas un par de veces, y teniendo en cuenta su respuesta, me gusta esta idea cada vez más. Necesito pensar un poco más en el contexto de mi programa, y ​​todas las implicaciones ... En general, esta es una buena idea – Didaxis

1

Prefiero tener un método de guardado independiente en el repositorio para tener la oportunidad de revertir mis cambios si algo sale mal.

Encontré este artículo Repositories and the Save Method. Espero que ayude

+0

Gracias por compartir el enlace. – Didaxis