我正在处理一个系统,它将其配置(广义上)存储在XML文件中。它还允许用户覆盖某些参数。现在,如果用户更改了配置,整个XML文件将被重写(在用户目录中)并进行更改。然而,它非常不方便。
让我们假设我们有基本配置,如:
<configuration>
<groupOfProperties>
<someProperty>Sample value</someProperty>
<otherProperty>Sample other value</otherProperty>
</groupOfProperties>
</configuration>
它已被用户覆盖,现在更改为如下所示:
<configuration>
<groupOfProperties>
<someProperty>Changed value</someProperty>
<otherProperty>Sample other value</otherProperty>
</groupOfProperties>
</configuration>
除非我们的基本配置由于某种原因而改变,否则它很酷并且没有问题。例如 - 添加了一个新参数:
<configuration>
<groupOfProperties>
<someProperty>Sample value</someProperty>
<otherProperty>Sample other value</otherProperty>
<newProperty>Sample new value<newProperty>
</groupOfProperties>
</configuration>
现在用户不知道这个改变,并且一些黑盒子读取XML文件将不会获得在基础上改变的新属性。然而,我们可以安全地假设不读取其中一些的事实是故障安全的,它只影响系统的功能层。
有没有办法聪明地保存更改的XML(最好是 - 只更改部分)并轻松地将其与基础文件“合并”,同时处理请求以获得特定值?
我想我实际保存的不是XML文件,而是某种补丁(https://tools.ietf.org/html/rfc5261)。然后在读取某些属性时,我基本上会读取基本文件并在其上应用补丁以获得“真实”配置?
我不是在寻找一个非常精确的实现,而是寻找这个问题的一般解决方案以及如何解决它的一些概念。
非常感谢你的答案!
附:在实际系统中,XML文件比给定的示例复杂得多。
P.S.2不幸的XML文件(或任何其他平面文件)是系统的唯一方法。我们可以称之为技术债务。
捕获数据变化的一般解决方案称为Event Sourcing。它允许通过应用所有先前的补丁来计算当前数据状态,并且还允许审核任何先前的状态。这种模式的典型例子是版本控制系统。