Dispose() 是将数据保存到光盘的好地方吗?
Is Dispose() a good place to save data to disc?
我正在创建一个基于平面文件 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 方法?
Is Dispose() the correct place to do this?
不,它用于清理。别掺和其他事情,把事情搞混了。
Or should I rather create a separate Commit/Save method?
是的,这会强制调用代码专注于如何以及何时调用它。而且它简单得多。
我强烈建议使用单独的保存方法。
dispose方法只是为了释放垃圾收集器无法清理的非托管资源。
我认为,在这种特殊情况下,一个好的模式是:
- 创建一个单独的 Commit 方法和一个单独的 RollBack 方法。
- 创建一个单独的 Close 方法,根据关闭数据库的语义调用 Commit 或 Rollback。
- 从您的 dispose 方法中调用您的 Close 方法,以便数据库在处理时关闭。
这样您就可以分离关注点并将语义清楚地分离到每个自己的方法中:
- 回滚、提交只关注那些操作并持久化数据。
- Close 关闭数据库并定义在该操作事件发生时打开事务发生的逻辑。
- Dispose 通过关闭对象来清理对象。
我正在创建一个基于平面文件 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 方法?
Is Dispose() the correct place to do this?
不,它用于清理。别掺和其他事情,把事情搞混了。
Or should I rather create a separate Commit/Save method?
是的,这会强制调用代码专注于如何以及何时调用它。而且它简单得多。
我强烈建议使用单独的保存方法。
dispose方法只是为了释放垃圾收集器无法清理的非托管资源。
我认为,在这种特殊情况下,一个好的模式是:
- 创建一个单独的 Commit 方法和一个单独的 RollBack 方法。
- 创建一个单独的 Close 方法,根据关闭数据库的语义调用 Commit 或 Rollback。
- 从您的 dispose 方法中调用您的 Close 方法,以便数据库在处理时关闭。
这样您就可以分离关注点并将语义清楚地分离到每个自己的方法中:
- 回滚、提交只关注那些操作并持久化数据。
- Close 关闭数据库并定义在该操作事件发生时打开事务发生的逻辑。
- Dispose 通过关闭对象来清理对象。