处理与 MvvmCross 和 SQLite 插件的连接的最佳方法是什么



我想知道 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 块来处置连接会更好吗?

还是继续创建和处置连接会产生更多开销。因此,在第一个例子中保持打开状态的原因是什么?

在实例化任何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");
}

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

  • 必要时创建资源
  • 有效地重用它们
  • 并妥善处理它们
使用

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

是的,使用using{}块(对于IDisposable接口实现的类)总是好的,因为它将确保object一旦离开块就会被释放。

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

最新更新