C# 使用MvvmCross和SQLite插件处理连接的最佳方法是什么

C# 使用MvvmCross和SQLite插件处理连接的最佳方法是什么,c#,mvvmcross,sqlite-net,C#,Mvvmcross,Sqlite Net,我想知道MvvmCross容器是否可以处理SQLite连接的处理,或者应该在存储库中手动完成 我见过如下代码示例,它们不会手动处理或关闭SQLite连接: public class ExampleRepository { private readonly ISQLiteConnection _connection; public ExampleRepository(ISQLiteConnectionFactory factory) { _connecti

我想知道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();
    }
}
公共类示例库
{
私有只读ISQLiteConnection\u连接;
公共示例库(ISQLiteConnectionFactory)
{
_connection=factory.Create(“Example.db”);
_connection.CreateTable();
}
公共IEnumerable All()
{
返回_connection.Table().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();
        }
    }
}
公共类示例库
{
私有只读ISQLiteConnectionFactory\u工厂;
公共示例库(ISQLiteConnectionFactory)
{
_工厂=工厂;
}
公共IEnumerable All()
{
使用(var连接=_factory.Create(“Example.db”))
{
connection.CreateTable();
返回连接.Table().ToList();
}
}
}
每次在存储库中使用连接时,使用using块来处理连接是否更好


还是继续创建和处理连接的开销更大。因此,在第一个示例中保持其打开状态的原因是?

在实例化任何
IDisposable
对象时,可以使用
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块处理连接是否更好 每次在存储库中使用时

YES使用{}
block(对于实现
IDisposable
接口的类)总是很好的,因为它将确保
对象离开块后将被释放

using (var connection = _factory.Create("Example.db"))
    {
        connection.CreateTable<Example>();
        return connection.Table<Example>().ToList();
    }//dispose here
使用(var连接=_factory.Create(“Example.db”))
{
connection.CreateTable();
返回连接.Table().ToList();
}//在这里处置

使用后,您应始终丢弃连接-任何使用。这同样适用于实现IDisPosable的对象当然,这假设您的ExampleRepository类不需要保留。