c# - 使用 xml 文件的数据访问层

标签 c# c#-4.0 xml-serialization

我想创建一个数据访问层,支持 CRUD 方法,底层存储 XML 文件。
我是 XML 新手,不太确定如何使用 XmlDocumentXDocumentXmlSerializer 等。
这是我对数据访问类的基本想法:

public class EmployeesDao
    {
        private const string FILE_NAME = "file.xml";

            //an XDocument which contains all the employees records
        private XDocument m_XDocument;
        private XmlSerializer m_XmlSerializer;


        public TestCasesDao()
        {
            //is this correct?
                    m_XDocument = XDocument.Load(@"c:\" + FILE_NAME);
            m_XmlSerializer = new XmlSerializer(typeof(EmployeeDTO));
        }

        public void Save(IEmployee employee)
        {
            var dto = new EmployeeDTO(employee);
            //TODO: serialize the DTO, add it to the XDocument, and save to file
        }

        public IEmployee GetEmployee(string name)
        {
                    //TODO: retrieve an EmployeeDTO from my XDocument
                    return employeeDto.Convert();  //return an IEmployee
        }

            //TODO: update and delete methods...
    }

关于如何填补缺失的空白有什么想法吗?

最佳答案

这真的取决于您的需求。将 XML 用于 DAL 仅对小型项目有意义,即使在这种情况下,SQLite 也可能是更好的解决方案。 XML 中唯一的“好处”是它是一种文本的、人类可读的格式,但从这个意义上说,它比实际的 DAL 技术更适合作为导出文件。任何“手工制作”的单文件数据库系统的问题在于,每次进行更改时都需要保存整个文件(如果您不选择 memory mapped files ,根据您的需要,这可能有点矫枉过正)。

对于每个插入或更新操作,您都需要一个读取器和一个写入器,以便将所有记录复制到一个新文件中。根据您的文件大小,一个选项可能是在您的应用程序生命周期内将记录保存在内存中,并每隔一段时间将它们刷新到磁盘。这将是一个静态可用的列表(考虑到并发性),但只有在数据库相对较小的情况下才有意义。

您最关心的可能是一致性和事务完整性。如果您有两个进程同时使用同一个 XML 文件,则很难同步访问。此外,应用程序崩溃或电源故障可能会使您的数据损坏,这意味着您还应该考虑某种日志系统。例如,SQLite,乍一看很简单,就是ACID。 , 并付出了大量的努力来实现这一目标(如果你有时间,请查看 this lengthy article 以获得想法)。从头开始实现这一点真是矫枉过正。

因此,总而言之,您的选择是:

  1. 您只有一个进程使用一个文件。

    一个。数据库很小:保存在内存中,锁定所有操作,并定期刷新。比较简单。

    数据库很大:

    • 使用读写器组合在每次操作时复制整个文件。非常简单,但速度较慢。

    • 保留命令队列并分批刷新它们。更快,添加了一些事务支持,但很复杂。

  2. 另一个进程可以访问该文件。

    一个。实现日志机制以防止同时访问。

    创建一个单独的服务,它将自行处理所有交易。

在任何情况下,您都可能需要保留一个事务日志文件并使用它来确保数据在访问之间是一致的。您的应用程序应该能够自行从故障中恢复。我的观点是 SQLite 可能是可行的方法:结合 NHibernate 等 ORM 解决方案,它使用起来非常简单和安全。

关于c# - 使用 xml 文件的数据访问层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8471614/

相关文章:

c# - 各种 GetLogicalDrives 方法之间有什么区别,哪种方法更好用

asp.net - 在 C# 中以小块下载大文件

.net - 如何从线程任务返回数据

java - 如何使用 SimpleXml 和 Java 动态生成 XML?元素,ElementList 应该动态出现在随机位置

C# Xml 序列化节点

c# - 为什么 XmlSerializer.Order 这样做

c# - “最近邻”缩放

c# - 如何永久为所有查询请求启用 Apollo Tracing with Hot Chocolate?

c# - 图像路径是否应该使用 MVVM 存储在 VM 中

c# - 在没有上下文的情况下获取应用程序的完全限定根 URL?