【问题标题】:Safeguarding against user error when saving a list of information保存信息列表时防止用户错误
【发布时间】:2018-08-03 18:35:33
【问题描述】:

我有一个private List<Experience> experiences;,用于跟踪一般体验和体验特定信息。我正在使用 Json Serialize 和 Deserialize 来保存和加载我的列表。当您启动应用程序时,列表会自动使用当前保存的信息填充自身,并且当将新体验添加到列表时,它会将新列表保存到文件中。

我想提前解决的一个问题是,没有什么可以阻止用户在任何时候执行experiences = new List<Experience>(); 之类的操作,然后为其添加新体验。保存这将导致所有以前的数据丢失,因为现在每次保存都会覆盖该文件。在理想的世界中,这不会发生,但我想弄清楚如何更好地构建我的代码来防范它。本质上,我想禁止从列表中删除项目或在列表已从加载中填充后将列表设置为新列表。

我曾想过将最新添加的内容附加到文件中,但我也想介绍一下您更改列表中现有项目的属性的情况,并且考虑到列表永远不会那么大文件,我认为覆盖将是最简单的方法,因为成本不是问题。

非常感谢任何帮助找出最佳方法的帮助。

编辑*查看了存储库模式https://www.infoworld.com/article/3107186/application-development/how-to-implement-the-repository-design-pattern-in-c.html,这似乎是一种潜在的方法。

【问题讨论】:

  • 您应该只公开添加和删除功能,而不是携带单个对象。查看存储库模式并使用 json 文件作为您的内部持久性
  • 感谢您的输入,将研究此模式。

标签: c# json save


【解决方案1】:

我假设您的用户在这种情况下是您的 API 的代码级使用者,并且他们将在同一个内存堆栈中使用结果,这让您担心引用突变。

在这种情况下,我会在读取操作时返回列表的副本而不是列表本身,并且在写入时只允许添加和删除,如 maccettura 在 cmets 中建议的那样。如果您希望消费者能够改变它们,您可以保持对列表中项目的引用完好无损,但我会仔细考虑这是否适合您的用例,并考虑要求消费者调用更新函数(这可能与您的添加函数 a-la HTTP PUT 相同)。

【讨论】:

    【解决方案2】:

    有时当你想强调你的集合不应该被修改时,将它公开为一个 IEnumerable 除了 List 可能就足够了,但如果你正在编写一些严肃的 API,比如存储库模式似乎是一个很好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多