0

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

还是继续创建和处理连接的开销更大。因此在第一个示例中将其打开的原因是什么?

4

2 回答 2

1

在实例化任何IDisposable对象时,您可以使用using语句来执行此操作。每当执行从 a 的范围返回时using,该对象就会被释放。这包括退货和例外。

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

当您构建一个需要IDisposable像您这样的持久对象的类时,您还应该创建自己的 class 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");
}

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

  • 您在必要时创建资源
  • 有效地重用它们
  • 并妥善处理
于 2014-02-28T18:37:43.287 回答
1

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

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

using (var connection = _factory.Create("Example.db"))
    {
        connection.CreateTable<Example>();
        return connection.Table<Example>().ToList();
    }//dispose here
于 2014-02-28T18:40:39.830 回答