2011-11-15 7 views
5

Co byłoby lepsze podejście do repozytorium oparte na XML:repozytorium XML; do Save() lub nie do Save()

1) Zapisz zmiany bazowego dokumentu XML na każdym wywołaniu repozytorium ...

public class XmlRepository1 
{ 
    private XDocument xDocument; 

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

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

lub

2) podać użytkownikowi końcowemu metodą 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); 
    } 
} 

Moja skłonność opiera się na opcji 1, ponieważ dostarczenie metody SaveChanges() nie wydaje się odpowiedzialnością repozytoriów. Jednakże, po drugie, zgaduję tę decyzję z kilku powodów:

a) W środowisku wielowątkowym daje to użytkownikowi końcowemu łatwy sposób na wycofanie zmian w przypadku niepowodzenia połączenia z repozytorium , pozostawiając obiekty w stanie częściowo zmutowanym.

b) Opcja 2 zapewnia paradygmat typu "batch-like", który z różnych powodów uważam za bardziej elastyczny.

+2

Jako komentarz do (a) nigdy nie należy zostawiać repozytorium w stanie częściowo zmutowanym, bez względu na to, co się stało. –

+0

@Matthew-Pozwól mi wyjaśnić ... Repozytorium nie pozostawi obiektów częściowo zmutowanych. Ale jeśli użytkownik końcowy zmienia stan obiektu, wywołuje funkcję Repository.Update (obj), a połączenie nie powiedzie się ... (widzisz, dokąd zmierzasz?) Mogę być tutaj nadmiernie paranoidalny, naprawdę nie 't know ... – Didaxis

Odpowiedz

3

Zastanówcie się nad dodaniem obsługi transakcji (w pobliżu drugiej aplikacji).

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 Po kilkakrotnym przejrzeniu kilku rzeczy i biorąc pod uwagę twoją odpowiedź, coraz bardziej lubię ten pomysł. Muszę o tym pomyśleć nieco w kontekście mojego programu i wszystkich jego konsekwencji ... Ogólnie rzecz biorąc, jest to dobry pomysł. – Didaxis

1

Wolę mieć oddzielną metodę zapisu w repozytorium, aby mieć szansę na cofnięcie zmian, jeśli coś pójdzie nie tak.

Znalazłem ten artykuł Repositories and the Save Method. Mam nadzieję, że to pomoże.

+0

Dzięki za udostępnienie linku. – Didaxis

Powiązane problemy