Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 是否通过存储库/服务/其他来持久化XML/CSV/Other_C#_.net_Design Patterns_Architecture_Oop - Fatal编程技术网

C# 是否通过存储库/服务/其他来持久化XML/CSV/Other

C# 是否通过存储库/服务/其他来持久化XML/CSV/Other,c#,.net,design-patterns,architecture,oop,C#,.net,Design Patterns,Architecture,Oop,我有一个从CSV文件或数据库导入信息并将其导出为XML的应用程序。此XML当前正在持久化到文件。然而,由于项目需要,我决定最好将这个XML持久化到数据库中 目前,我拥有处理导入/导出数据的CSV、XML和SQL存储库。XML存储库将传入的对象持久化为文件。它目前是存储对象到XML的映射的地方,因此它是唯一知道这个结构的地方(同样,其他存储库也知道它们各自的结构) 现在我想将XML存储在数据库中,我开始质疑这种体系结构。为了向数据库中插入XML,XML的结构必须可以从SQL存储库中访问(注意,其他

我有一个从CSV文件或数据库导入信息并将其导出为XML的应用程序。此XML当前正在持久化到文件。然而,由于项目需要,我决定最好将这个XML持久化到数据库中

目前,我拥有处理导入/导出数据的CSV、XML和SQL存储库。XML存储库将传入的对象持久化为文件。它目前是存储对象到XML的映射的地方,因此它是唯一知道这个结构的地方(同样,其他存储库也知道它们各自的结构)

现在我想将XML存储在数据库中,我开始质疑这种体系结构。为了向数据库中插入XML,XML的结构必须可以从SQL存储库中访问(注意,其他列中的数据可以与XML一起插入数据库)。这让我想知道XML表示是否应该存储在对象本身、服务层或其他地方

实施此问题解决方案的最佳方法是什么


更新:对我的问题的澄清。XML存储库当前保存到一个文件。在我看来,保持对XML结构的了解是错误的,因为这样我就不能灵活地将XML表示持久化到我想要的任何介质中。让对象知道它的XML表示(或CSV表示等)是否是糟糕的设计?如果将对该结构的了解保留在另一个级别,那将是什么级别?

如果希望SQL存储库能够使用现有的xml层,那么我相信某种基于接口的抽象(provider/IoC/DI/etc)是可能的,因此,SQL存储库可以使用xml堆栈,而无需明确了解它

当然,如果对象模型本身定义了xml结构(通过
XmlSerializer
等的属性),那么这就更简单了,xml repo也变得相当简单


至于了解数据库内部的结构:这取决于是否需要查询数据库内部的数据。如果是这样,那么在SQL Server中可以做很多事情——例如,可以将xml列绑定到xsd,或者可以将xml的部分(通过udf/xquery)升级到持久化的索引列。但是,如果您只是使用数据库进行存储,那么这是没有必要的——事实上,如果您以后需要更改xsd(这不是小事),那么在数据库中使用xsd是一个主要的PITA。

您还可以尝试使用本机XML数据库,例如,它可以满足您的XML存储和检索需求

更新:另一个解决方案可能是使用DBMS的XML功能。几乎所有现代DBMS都支持XML类型,因此最好的方法应该是这样(将XML类型用于存储数据的列)

更新2:如果您只需要存储结构化信息(如果我没有错的话,您可以从CSV导入并将其存储在单个XML文件中),为什么不使用普通的旧RDMBS呢?我发现将数据存储在不受控制地增长的XML文件中没有任何优势。如果要从该文件中检索某些数据(摘要或非摘要),会发生什么情况?它越大,完成这项工作所需的时间和计算机资源就越多。如果使用SAX,则需要处理整个文件,因此访问文件末尾的数据将比访问文件开头的数据花费更多的时间。使用DOM会更糟糕,因为文件越大,处理它所需的内存就越多


另一方面,如果我理解错了,您需要的是保留许多XML文件,并且每个XML文件本身作为一条信息是有意义的(您必须交付XML文件或XML文件片段作为结果),那么我将采用原生XML数据库方式,因为这是存储和访问这些数据的最自然的方式。

您是否可以将XML存储库更改为具有SQL后端。yopur存储库做什么并不重要,它们只是用来存储和检索数据的“黑匣子”。在XML存储库中为您保密XML知识,并使用SQL作为后端


您可以将其链接到SQL存储库或将其分开。

持久性可以被视为一个交叉关注点,这意味着对象不应该关心持久性是如何执行的,而应该只关心持久性是如何执行的;例如,您可以定义一个PersistentStoreFactory,该工厂创建的对象实现了一个PersistentStore接口,该接口具有一个通用的Persist方法


然后,可以使用Persist属性装饰类,该属性将使用工厂创建PersistentStore,然后调用传入对象实例的Persist方法。如果您决定将来为不同类型的类使用不同的持久性机制,您可以扩展属性,使其具有类型为string的参数,以公开PersistanceMedia ie数据库、文件系统、云、URL等。如果XML的结构是常量,您可以在上看到我的博客文章。它允许编写XML,但主要用于读取XML。一旦为XML创建了所有类,就可以通过代码轻松访问对象,并直接从代码生成/运行批处理脚本,同时确保数据有效并遵守特定模式


当然,如果可能的话,最好的方法仍然是直接使用一些DTO创建CSV>数据库。

在我看来,将对象转换为文本格式并将文本存储在某个地方的过程可以而且应该是可分离的。我想这些东西中哪一个是“主要的”取决于应用程序的结构。也就是说,无论你

  • 告诉对象“自己去存储”,应用程序的配置决定了这一点