Dispose()是将数据保存到光盘的好地方吗?

时间:2017-10-26 06:39:42

标签: c# dispose idisposable

我正在创建一个基于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方法吗?

3 个答案:

答案 0 :(得分:4)

  

Dispose()是正确的地方吗?

不,它是用于清理。不要混淆其他问题来混淆问题。

  

或者我应该创建一个单独的Commit / Save方法?

是的,这会强制调用代码关注如何以及何时调用它。而且它更清晰。

答案 1 :(得分:2)

我认为,在这种特殊情况下,一个好的模式是:

  • 创建一个单独的Commit方法和一个单独的RollBack方法。
  • 创建一个单独的Close方法,该方法根据关闭数据库的语义调用Commit或Rollback。
  • 从dispose方法调用Close方法,以便数据库在处理时关闭。

通过这种方式,您可以分离关注点并明确将语义分离为每个自己的方法:

  • 回滚,只关注这些操作并保留数据。
  • 关闭数据库并定义在该操作事件中打开事务时会发生什么的逻辑。
  • Dispose通过关闭它来清理对象。

答案 2 :(得分:1)

我强烈推荐单独的Save方法。

dispose方法仅用于释放垃圾收集器无法清理的非托管资源。