2012-04-05 50 views
2

我很難嘗試創建一個XmlRepository。這裏的問題我有唯一的選擇使用XmlSerializer來做到這一點。如何使用XmlSerializer創建XmlRepository?

請檢查出來。這真讓我的代碼亂成一團,令人沮喪。我想知道我該如何改進這些代碼,我正在考慮創建一個單例,但我不知道如何繼續。

public interface IRepository<T> 
    where T : class 
{ 
    T GetById(object id); 
    IEnumerable<T> All(); 
    void Insert(T entity); 
    void Remove(T entity); 
    void SaveChanges(); 
} 

public class XmlRepository : IRepository<Configuration> 
{ 
    public XmlRepository(string filename) 
    { 
     FileName = filename; 
    } 

    public XmlRepository(string filename) 
    { 
     FileName = filename; 
    } 

    internal string FileName { get; private set; } 

    private Configuration GetById(object id) 
    { 
     throw new NotImplementedException(); 
    } 

    public IEnumerable<Configuration> All() 
    { 
     return Get(); 
    } 

    public void Insert(Configuration entity) 
    { 
     var configurations = Get(); 
     configurations.Add(entity); 
     Save(configurations); 
    } 

    public void Remove(Configuration entity) 
    { 
     var configurations = Get(); 
     configurations.Remove(entity); 
     Save(configurations); 
    } 

    private List<Configuration> Get() 
    { 
     try 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(List<Configuration>), null, new Type[] { typeof(BinaryConfiguration) }, new XmlRootAttribute("Configurations"), "http://ofimbres.wordpress.com/"); 
      StreamReader myWriter = new StreamReader(FileName); 
      var list = serializer.Deserialize(myWriter); 
      myWriter.Close(); 

      return (List<Configuration>)list; 
     } 
     catch (InvalidOperationException ex) 
     { 
      throw ex; 
     } 
    } 

    public void Save(object configurations) 
    { 
     try 
     { 
      XmlSerializer serializer = new XmlSerializer(configurations.GetType(), null, new Type[] { typeof(BinaryConfiguration) }, new XmlRootAttribute("Configurations"), "http://ofimbres.wordpress.com/"); 
      StreamWriter myWriter = new StreamWriter(FileName); 
      serializer.Serialize(myWriter, configurations); 
      myWriter.Close(); 
     } 
     catch (XmlException ex) 
     { 
      throw ex; 
     } 
    } 
} 

有任何疑問,請讓我知道。 非常感謝

回答

3

,而不是讀和每次調用的庫時寫的文件,我將做到以下幾點:

在你文件讀入到Configuration對象的列表構造。就像您現在在Get方法中所做的一樣。您將此列表保存在類的一個字段中,並將其用於所有其他方法(添加等)。

您的存儲庫確實有SaveChanges方法,因此這是將配置序列化回磁盤的理想位置。

這應該是比現有的方法更多的性能,不那麼複雜,因此也更不容易出錯。

編輯:這裏是一個開始:

public class XmlRepository : IRepository<Configuration> 
{ 
    private readonly List<Configuration> configurations; 

    public XmlRepository(string filename) 
    { 
     FileName = filename; 

     XmlSerializer serializer = new XmlSerializer(typeof(List<Configuration>), null, new Type[] { typeof(BinaryConfiguration) }, new XmlRootAttribute("Configurations"), "http://ofimbres.wordpress.com/"); 
     using (StreamReader myWriter = new StreamReader(FileName)) 
     { 
      configurations = (List<Configuration>)serializer.Deserialize(myWriter); 
      myWriter.Close(); 
     } 
    } 

    internal string FileName { get; private set; } 

    public Configuration GetById(object id) 
    { 
     return (from c in configurations where c.Id == id select c).Single(); 
    } 

    public IEnumerable<Configuration> All() 
    { 
     return configurations; 
    } 

    public void Insert(Configuration entity) 
    { 
     configurations.Add(entity); 
    } 

    public void Remove(Configuration entity) 
    { 
     configurations.Remove(entity); 
    } 

    public void SaveChanges() 
    { 
     XmlSerializer serializer = new XmlSerializer(configurations.GetType(), null, new Type[] { typeof(BinaryConfiguration) }, new XmlRootAttribute("Configurations"), "http://ofimbres.wordpress.com/"); 
     using (StreamWriter myWriter = new StreamWriter(FileName)) 
     { 
      serializer.Serialize(myWriter, configurations); 
      myWriter.Close(); 
     } 
    } 
} 

也有一些一般性的建議

  • 使用using用於處理需要被置於文件/流和其他資源(StreamReader和在這種情況下爲StreamWriter)。這保證即使有異常時該文件也將被關閉。
  • 不要捕捉和重新拋出異常,或者如果你這樣做,至少使用throw而不是throw ex來保留完整的堆棧跟蹤。

希望這有助於!