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.
Jako komentarz do (a) nigdy nie należy zostawiać repozytorium w stanie częściowo zmutowanym, bez względu na to, co się stało. –
@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