4

接続文字列とインスタンスのインスタンスを挿入することのトレードオフは何IDbConnectionですか?

StructureMapを使用して、ASP.NET MVCアプリケーションにさまざまなサービスを挿入します。そのほとんどは、LINQ-to-SQLクエリのデータベースアクセスを必要とします。注入は、一般的な接続文字列IDbConnectionパラメーターよりもテスト可能でIoCの構成が簡単なようですが、接続をブロックで明示的にラップしないと、開いている接続がぶら下がるのが心配です。using

注意すべき接続プールの長所または短所はありますか?

挿入された接続文字列

using (var con = new SqlConnection(InjectedConnectionString))
{
    con.Execute("INSERT INTO Logs (...) VALUES (...)");
    using (var db = new MyDataContext(con))
    {
        var records = from p in db.Products
                      select p;
    }
}

注入されたIDbConnection

con.Execute("INSERT INTO Logs (...) VALUES (...)");
using (var db = new MyDataContext(InjectedConnection))
{
    var records = from p in db.Products
                  select p;
}
4

1 に答える 1

3

適度に洗練されたIoCコンテナ(構造マップ)の機能は、オブジェクトの存続期間を制御できることです。デフォルトでは、structuremapは一時的な有効期間を使用します。これは、オブジェクトグラフごとに新しいインスタンスを作成することを意味します。実際には、これは多くの場合、Webリクエストごとと同じです(コードにの使用法を散りばめない限りcontainer.GetInstance<T>())。

構造マップを使用してデータベース接続などの貴重なリソースを注入することにより、それらの存続期間を制御できます。単一のリソース(選択した場合)は、Webリクエスト全体で再利用することも、使用するたびに新しく作成することもできます。

さらに、これらの選択肢(および構成)は、コードに散在するのではなく、レジストリに外部化されるようになりました。接続の作成方法を変更する必要がある場合は、1か所を確認するだけで済みます。単一責任のクラスが常に優先されます。

接続プールに関する限り、接続プールなどの詳細にIoCコンテナが関与することはありません。しかし、彼らは生涯を助けます。StructuremapはDispose()任意のIDisposableオブジェクトを呼び出します(実際には、それを呼び出すのはインタープリターです)。

編集:接続プールについても、各ライフタイムには、オブジェクトをいつどのように破棄するかについての独自のルールがあります。TransientはCLRに依存して破棄しHttpRequestScopedますが、各要求の最後に決定論的にオブジェクトを破棄します。を使用HttpRequestScopedすると、接続数を最大化できなくなります。

于 2012-08-25T14:23:10.827 に答える