2012-04-05 7 views
2

Ich habe Schwierigkeiten, ein XmlRepository zu erstellen. Das Problem hier habe ich die einzige Möglichkeit, dies mit XmlSerializer zu tun.Wie erstellt man ein XmlRepository mit XmlSerializer?

Bitte überprüfen Sie es. Es ist wirklich ein Durcheinander, mein Code und frustrierend. Ich möchte wissen, wie ich diesen Code verbessern kann, ich dachte daran, ein Singleton zu erstellen, aber ich bin nicht sicher, wie ich weitermachen soll.

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

Zweifel, bitte lassen Sie es mich wissen. Vielen Dank

Antwort

3

Statt Lesen und Schreiben der Datei jedes Mal, wenn das Repository nennen, würde ich folgendes:

Im Konstruktor Sie die Datei in eine Liste von Configuration Objekte lesen. Genau wie Sie in der Get Methode im Moment tun. Sie speichern diese Liste in einem Feld der Klasse und verwenden sie für alle anderen Methoden (hinzufügen usw.).

Ihr Repository verfügt über eine SaveChanges-Methode, also ist dies der ideale Ort, um die Konfiguration auf die Festplatte zu serialisieren.

Dies sollte viel leistungsfähiger sein als der aktuelle Ansatz, weniger komplex und daher auch weniger fehleranfällig.

Edit: Hier ist ein Anfang:

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

auch einige allgemeine Vorschläge

  • Verwenden using für Dateien/Streams und andere Ressourcen Handhabung, die entsorgt werden muss (StreamReader und StreamWriter in diesem Fall). Dies garantiert, dass die Datei auch bei einer Ausnahme geschlossen wird.
  • Keine Ausnahmen abfangen und erneut auslösen, oder wenn Sie es tun, verwenden Sie mindestens throw anstelle von throw ex, um die vollständige Stapelüberwachung beizubehalten.

Hoffe, das hilft!