我想知道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 :(得分: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");
}
最终,后一种解决方案是最好的,因为:
答案 1 :(得分:1)
使用using块来处理连接会更好吗? 每次在存储库中使用它?
是使用using{}
块(对于实现IDisposable
接口的类)始终是好的,因为它将确保object
将被处置一次它离开了街区。
using (var connection = _factory.Create("Example.db"))
{
connection.CreateTable<Example>();
return connection.Table<Example>().ToList();
}//dispose here