我有一个private List<Experience> experiences;
,可以跟踪一般的体验和特定的信息。我正在使用Json序列化和反序列化来保存和加载我的列表。启动应用程序时,列表会自动使用当前保存的信息填充自身,并且当将新的体验添加到列表中时,它将新列表保存到文件中。
一个我想超越的担忧是,没有什么可以阻止用户在任何时候做类似experiences = new List<Experience>();
之类的事情,然后为其添加新的体验。保存此文件将导致所有先前数据丢失,因为现在文件每次保存都会覆盖该文件。在理想的世界中,这不会发生,但是我想弄清楚如何更好地构造代码以防止这种情况发生。本质上,我是想禁止从列表中删除项目,或者在加载完成后将列表设置为新列表。
我已经想到了将最新添加的内容添加到文件中的想法,但是我也想介绍一下您更改列表中现有项目的属性的情况,并且考虑到列表永远不会那么大对于文件,我认为覆盖是最简单的方法,因为成本不是问题。
感谢大家对找出最佳方法的帮助。
编辑*调查了存储库模式https://www.infoworld.com/article/3107186/application-development/how-to-implement-the-repository-design-pattern-in-c.html,这似乎是一种潜在的方法。
答案 0 :(得分:1)
我假设您的用户在这种情况下是您API的代码级使用者,并且他们将在同一内存堆栈中使用结果,这使您担心引用突变。
在这种情况下,我将在读取操作时返回列表的副本,而不是列表本身,并且在写入时仅允许按照maccettura在注释中的建议进行添加和删除。如果您希望使用者能够对其进行突变,则可以保留对列表中项目的引用,但我会仔细考虑这是否适合您的用例,并考虑改为要求使用者调用更新函数(可能与您的添加功能a-la HTTP PUT相同)。
答案 1 :(得分:1)
有时候,当您想强调不要修改您的集合时,可以将其作为IEnumerable公开,但List可能就足够了,但是如果您正在编写一些严肃的API,则像存储库模式之类的东西似乎是一个很好的解决方案。