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オブジェクトを必要とするクラスを構築するときは、独自のクラスも作成し、メソッド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{}です(インターフェイスを実装するクラスの場合)。IDisposableobject

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