我正在创建一个基于json的平面文件数据库,用于学习目的。我正在更改JsonDatabase对象包含的数据,但我想在完成所有更改后才将它们保存到光盘。
这是我目前的做法:
public class UserMatch
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class JsonDatabase : IJsonDatabase, IDisposable
{
private readonly FileStream _jsonDatabaseStream;
private List<UserMatch> _userMatches;
public List<UserMatch> UserMatches
{
get
{
if (_userMatches == default(List<UserMatch>))
{
string fileContent;
using (var sr = new StreamReader(_jsonDatabaseStream))
{
fileContent = sr.ReadToEnd();
}
_userMatches = JsonConvert.DeserializeObject<List<UserMatch>>(fileContent);
}
return _userMatches;
}
set { _userMatches = value; }
}
public JsonDatabase(string fileLocation)
{
_jsonDatabaseStream = File.Open(fileLocation, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
}
public void Dispose()
{
string serialisedJson = JsonConvert.SerializeObject(UserMatches);
using (var sr = new StreamWriter(_jsonDatabaseStream))
{
sr.Write(serialisedJson);
}
_jsonDatabaseStream.Dispose();
}
}
Dispose()是正确的地方吗?或者我应该创建一个单独的Commit / Save方法吗?
答案 0 :(得分:4)
Dispose()是正确的地方吗?
不,它是用于清理。不要混淆其他问题来混淆问题。
或者我应该创建一个单独的Commit / Save方法?
是的,这会强制调用代码关注如何以及何时调用它。而且它更清晰。
答案 1 :(得分:2)
我认为,在这种特殊情况下,一个好的模式是:
通过这种方式,您可以分离关注点并明确将语义分离为每个自己的方法:
答案 2 :(得分:1)
我强烈推荐单独的Save方法。
dispose方法仅用于释放垃圾收集器无法清理的非托管资源。