使用MvvmCross和SQLite插件配置连接的最佳方法是什么

时间:2014-02-28 18:34:53

标签: c# mvvmcross sqlite-net

我想知道MvvmCross容器是否可以处理SQLite连接的处理,还是应该在存储库中手动完成。

我见过以下代码示例,它们不会手动处理或关闭SQLite连接:

public class ExampleRepository
{
    private readonly ISQLiteConnection _connection;

    public ExampleRepository(ISQLiteConnectionFactory factory)
    {
        _connection = factory.Create("Example.db");
        _connection.CreateTable<Example>();
    }

    public IEnumerable<Example> All()
    {
        return _connection.Table<Example>().ToList();
    }
}

这会是更好的选择吗?

public class ExampleRepository
{
    private readonly ISQLiteConnectionFactory _factory;

    public ExampleRepository(ISQLiteConnectionFactory factory)
    {
        _factory = factory;
    }

    public IEnumerable<Example> All()
    {
        using (var connection = _factory.Create("Example.db"))
        {
            connection.CreateTable<Example>();
            return connection.Table<Example>().ToList();
        }
    }
}

每次在存储库中使用连接时,使用using块来处理连接会更好吗?

或者继续创建和部署连接是否需要更多开销。因此,在第一个例子中保持开放的原因是什么?

2 个答案:

答案 0 :(得分:1)

在实例化任何IDisposable对象时,您可以使用using语句执行此操作。只要执行从using的范围返回,对象就会被处理掉。这包括退货和例外。

using (var obj = new Connection()) {
    throw new Exception("This will dispose of obj");
}

当你构建一个需要像你这样的持久IDisposable对象的类时,你也应该创建自己的类IDisposable,并在Dispose()方法中处理这些对象:

public class MyClass : IDisposable
{
    Connection con = new Connection();
    public void Dispose()
    {
        con.Dispose();
    }
}

然后,当您实例化自己的类时,请使用using,并且在适当的时候将很乐意处理所有内容。

using (var obj = new MyClass()) {
    throw new Exception("This will dispose of obj, and obj.con");
}

最终,后一种解决方案是最好的,因为:

  • 您在必要时创建资源
  • 有效地重复使用
  • 并正确处理它们

答案 1 :(得分:1)

  

使用using块来处理连接会更好吗?   每次在存储库中使用它?

使用using{}块(对于实现IDisposable接口的类)始终是好的,因为它将确保object将被处置一次它离开了街区。

using (var connection = _factory.Create("Example.db"))
    {
        connection.CreateTable<Example>();
        return connection.Table<Example>().ToList();
    }//dispose here