2012-04-05 5 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; 
     } 
    } 
} 

ご不明な点がありましたらお知らせください。あなたがConfigurationオブジェクトのリストにファイルを読み込むコンストラクタで

: おかげでたくさん

答えて

3

の代わりに読み、あなたがリポジトリを呼び出すたびにファイルの書き込みには、私は次のことを行うだろう。現時点ではGetの方法と同じです。このリストをクラスのフィールドに保存し、それを他のすべてのメソッド(追加など)に使用します。

リポジトリにはSaveChangesメソッドがあります。したがって、構成をディスクにシリアル化するのに理想的な場所です。

これは、現在のアプローチよりもパフォーマンスがよく、複雑さが低く、したがってエラーが発生しにくいはずです。編集

:ここが開始される。また、いくつかの一般的な提案に配置する必要がありますファイル/ストリームや他のリソースを処理するための

  • 使用using

    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(); 
         } 
        } 
    } 
    

    StreamReaderとこの場合はStreamWriter)。これにより、例外があってもファイルが閉じられることが保証されます。

  • 例外をキャッチして再発行しないでください。そうしないと、完全なスタックトレースを保持するために、throw exの代わりにthrowを少なくとも使用してください。

関連する問題