2014-02-28 44 views
0

我想知道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块是在存储库中每次使用时处置该连接的?

或者是更持续创建和处置连接的开销。因此,在第一个例子中将其打开的原因是什么?

+0

您应该始终在使用后处理连接 - 任何用法。同样适用于实现IDisposable的对象 –

回答

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"); 
} 

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

  • 创建资源,必要时
  • 高效地重用他们
  • 并妥善处置这些
+0

当然,这假定您的ExampleRepository类不需要停留。 – wizulus

1

使用using块来处理连接会更好吗?每次在资源库中使用它时都会使用 ?

这是一件好事使用using{}块(为此implemet IDisposable接口的类),因为这将确保一旦离开块object将非常具有布置。

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