2

XmlRepositoryを作成するのに苦労しています。ここでの問題は、XmlSerializerを使用してこれを行う唯一の選択肢です。

チェックアウトしてください。それは本当に私のコードを台無しにし、イライラさせます。このコードをどのように改善できるか知りたいのですが、シングルトンを作成することを考えていましたが、続行する方法がわかりません。

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

疑問がある場合は、お知らせください。どうもありがとう

4

1 に答える 1

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その他のリソース(この場合)を処理するために使用します。これにより、例外が発生した場合でもファイルが閉じられることが保証されます。StreamReaderStreamWriter
  • 例外をキャッチして再スローしないでください。例外をキャッチして再スローする場合は、少なくとも、スタックトレース全体を保持するthrow代わりに使用してください。throw ex

お役に立てれば!

于 2012-04-05T17:48:45.247 に答える