Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用XmlSerializer创建XmlRepository?_C#_Xml_Xml Serialization_Repository_Repository Pattern - Fatal编程技术网

C# 如何使用XmlSerializer创建XmlRepository?

C# 如何使用XmlSerializer创建XmlRepository?,c#,xml,xml-serialization,repository,repository-pattern,C#,Xml,Xml Serialization,Repository,Repository Pattern,我很难创建一个XmlRepository。这里的问题是,我只能选择使用XmlSerializer 请检查一下。我的代码真是一团糟,令人沮丧。我想知道如何改进这段代码,我想创建一个单例,但我不知道如何继续 public interface IRepository<T> where T : class { T GetById(object id); IEnumerable<T> All(); void Insert(T entity);

我很难创建一个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;
        } 
    }
}
公共接口IRepository
T:在哪里上课
{
T GetById(对象id);
i可数全部();
无效插入(T实体);
无效删除(T实体);
void SaveChanges();
} 
公共类XmlRepository:IRepository
{
公共XmlRepository(字符串文件名)
{
FileName=文件名;
}
公共XmlRepository(字符串文件名)
{
FileName=文件名;
}
内部字符串文件名{get;private set;}
私有配置GetById(对象id)
{
抛出新的NotImplementedException();
}
公共IEnumerable All()
{
返回Get();
}
公共无效插入(配置实体)
{
var配置=Get();
配置。添加(实体);
保存(配置);
}
公共无效删除(配置实体)
{
var配置=Get();
配置。删除(实体);
保存(配置);
}
私有列表Get()
{
尝试
{
XmlSerializer serializer=新的XmlSerializer(typeof(List),null,新类型[]{typeof(BinaryConfiguration)},新的XmlRootAttribute(“配置”),“http://ofimbres.wordpress.com/");
StreamReader myWriter=新的StreamReader(文件名);
var list=serializer.Deserialize(myWriter);
myWriter.Close();
返回(列表)列表;
}
捕获(无效操作异常ex)
{
掷骰子;
}
}
公共作废保存(对象配置)
{
尝试
{
XmlSerializer serializer=新XmlSerializer(configurations.GetType(),null,新类型[]{typeof(BinaryConfiguration)},新XmlRootAttribute(“配置”),“http://ofimbres.wordpress.com/");
StreamWriter myWriter=新的StreamWriter(文件名);
serializer.Serialize(myWriter,配置);
myWriter.Close();
}
捕获(XmlException-ex)
{
掷骰子;
} 
}
}
如有疑问,请告诉我。
非常感谢

我将执行以下操作,而不是每次调用存储库时都读写文件:

在构造函数中,将文件读入
配置
对象列表。就像您现在在
Get
方法中所做的那样。将此列表保存在类的字段中,并将其用于所有其他方法(add等)

您的存储库确实有一个
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();
        }
    }
}
公共类XmlRepository:IRepository
{
私有只读列表配置;
公共XmlRepository(字符串文件名)
{
FileName=文件名;
XmlSerializer serializer=新的XmlSerializer(typeof(List),null,新类型[]{typeof(BinaryConfiguration)},新的XmlRootAttribute(“配置”),“http://ofimbres.wordpress.com/");
使用(StreamReader myWriter=newstreamreader(文件名))
{
配置=(列表)序列化程序。反序列化(myWriter);
myWriter.Close();
}
}
内部字符串文件名{get;private set;}
公共配置GetById(对象id)
{
返回(在c.Id==Id选择c的配置中从c返回);
}
公共IEnumerable All()
{
返回配置;
}
公共无效插入(配置实体)
{
配置。添加(实体);
}
公共无效删除(配置实体)
{
配置。删除(实体);
}
公共void SaveChanges()
{
XmlSerializer serializer=新XmlSerializer(configurations.GetType(),null,新类型[]{typeof(BinaryConfiguration)},新XmlRootAttribute(“配置”),“http://ofimbres.wordpress.com/");
使用(StreamWriter myWriter=newstreamwriter(文件名))
{
serializer.Serialize(myWriter,配置);
myWriter.Close();
}
}
}
还有一些一般性建议

  • 使用
    using
    处理需要处理的文件/流和其他资源(
    StreamReader
    StreamWriter
    )。这保证了即使出现异常,文件也会被关闭
  • 不要捕获并重新抛出异常,或者如果这样做,至少使用
    throw
    而不是
    throw ex
    来保留完整的堆栈跟踪
希望这有帮助