2011-11-15 3 views
5

Điều gì sẽ là một cách tiếp cận tốt hơn cho một kho lưu trữ dựa trên XML:Kho lưu trữ XML; Lưu() hay không để Save()

1) Lưu thay đổi vào các tài liệu xml cơ bản trên mỗi cuộc gọi đến kho ...

public class XmlRepository1 
{ 
    private XDocument xDocument; 

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

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

hoặc

2) Cung cấp cho người dùng cuối với một phương pháp 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); 
    } 
} 

Độ nghiêng của tôi nghiêng về phía tùy chọn 1, vì việc cung cấp phương thức SaveChanges() không thực sự có vẻ giống như trách nhiệm kho lưu trữ. Tuy nhiên, tôi đang đoán quyết định thứ hai này vì một vài lý do:

a) Trong môi trường nhiều luồng, điều này mang lại cho người dùng cuối cách dễ dàng để quay lại thay đổi nếu cuộc gọi đến kho lưu trữ bị lỗi , để các vật thể ở trạng thái bị biến đổi một phần.

b) Tùy chọn 2 cung cấp một mô hình "giống hàng loạt", mà tôi có thể thấy là linh hoạt hơn vì nhiều lý do khác nhau.

+2

Là một nhận xét cho (a), bạn không bao giờ nên rời khỏi kho lưu trữ của mình ở trạng thái đột biến một phần, bất kể điều gì đã xảy ra. –

+0

@Matthew -Hãy để tôi làm rõ ... Kho lưu trữ sẽ không để các đối tượng bị đột biến một phần. Nhưng nếu người dùng cuối thay đổi trạng thái của một đối tượng, hãy gọi Repository.Update (obj) và cuộc gọi không thành công ... (bạn thấy tôi sẽ đi đâu với điều này?) Tôi có thể quá hoang tưởng ở đây, tôi thực sự không Không biết ... – Didaxis

Trả lời

3

Cân nhắc thêm một số loại hỗ trợ giao dịch (gần với apporach thứ hai của bạn).

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 Sau khi xem xét mọi thứ một vài lần và xem xét câu trả lời của bạn, tôi thích ý tưởng này hơn và nhiều hơn nữa. Tôi cần phải suy nghĩ về nó nhiều hơn một chút trong bối cảnh của chương trình của tôi, và tất cả các tác động ... Nhìn chung, đây là một ý tưởng tốt – Didaxis

1

Tôi muốn có phương pháp Lưu riêng biệt trong kho lưu trữ để có cơ hội hoàn nguyên thay đổi của tôi nếu có sự cố.

Tôi tìm thấy bài viết này Repositories and the Save Method. Hy vọng nó sẽ giúp.

+0

Cảm ơn bạn đã chia sẻ liên kết. – Didaxis