我想知道 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