2011-11-15 161 views
5

什麼將是一個基於XML的存儲庫中的更好的方法:XML存儲庫;保存()或不保存()

1)保存在每次調用庫更改基礎XML文檔...

public class XmlRepository1 
{ 
    private XDocument xDocument; 

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

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

2)提供一種具有調用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); 
    } 
} 

我的傾向傾向於選項1,因爲提供SaveChanges()方法看起來不像是存儲庫的責任。然而,我猜測這個決定的原因有以下幾個:

a)在多線程環境中,這給最終用戶提供了一種簡單的方法來回滾更改,如果調用存儲庫失敗,使物體處於部分變異狀態。 b)選項2提供了一個「批次式」的範例,我可以看到,由於各種原因,這種範例更加靈活。

+2

作爲對(a)的評論,無論發生什麼事情,都不應將您的存儲庫置於部分變異狀態。 –

+0

@Matthew - 讓我澄清...存儲庫不會讓對象部分變異。但是如果一個最終用戶改變一個對象的狀態,調用Repository.Update(obj)並且調用失敗......(你知道我要去哪裏?)我可能在這裏過分偏執,我真的不知道不知道... – Didaxis

回答

3

考慮添加某種事務支持(接近您的第二個應用程序)。

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經過幾次查看之後,考慮你的答案,我越來越喜歡這個想法。我需要在我的程序中考慮一下,以及所有的影響......總的來說,這是一個好主意 – Didaxis

1

我更喜歡在存儲庫中有單獨的Save方法,以便有機會在出現問題時恢復我的更改。

我找到這篇文章Repositories and the Save Method。希望它會有所幫助。

+0

感謝您分享鏈接。 – Didaxis