クラスに共通のデータベース接続を配置する場所


11

データベースにオブジェクトを保存したり、データベースからオブジェクトを取得したりするクラス(リポジトリ)がいくつかあります。それらすべてが1つのデータベースへの接続を確立する必要があります。

各クラスでConnectionStringとを再定義しないようにSqlConnection、オープン接続をそれらに渡すことを考えました。次に、その接続を定義/オープンしてクラスに渡すのに最適な場所/時間はいつ/どこですか?

この共通のリソースにアクセスするためのより良いアプローチ/パターンはありますか?

回答:


10

各クラスにオープン接続を渡すことは、おそらく最良のアイデアではありません。データベース接続作成を読んでください-それは1回ですか、それともクエリごとですか?

開いている接続をリポジトリに渡すのではなく、実行するクエリごとに接続を開いたり閉じたりすることをお勧めします。

接続の管理に役立つように、このようなことを試すことができます。

public class Repository
{
    private readonly string _connectionString;

    public Repository()
    {
        _connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString
    }

    protected SqlConnection GetConnection()
    {
         return new SqlConnection(_connectionString);
    }


}

public sealed class UserRespository : Repository
{

    public User GetUsers()
    {
        using (var connection = GetConnection())
        {
            using (var commnad = new SqlCommand("SqlQuery", connection))
            {
                //Execute Query
                //Return results
            }
        }
    }
}

5

一般に、接続を開いてクラス間で渡すことはお勧めできません。確かに、接続を開くことはパフォーマンスに大きな影響を与えますが、すでに開かれている接続を再利用することで、接続プールによってすでに対処されています。ただしconnection.Open()、特にマルチスレッドコードでは、メソッドへの接続が割り当てられるため、常にできるだけ長くを呼び出してください(データベースへのオープン接続に必要な量が大幅に増加します)。

クラスをできるだけ汎用的にするには、IDbConnectionを使用してメソッドを公開する基本クラスを用意することをお勧めします。リポジトリには、より汎用的な実装が含まれます。

internal abstract class Repository
{
    private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString;

    protected IDbConnection GetConnection()
    {
        return new SqlConnection(ConnectionString);
    }
}

public class MyRepository : Repository
{
    public IEnumerable<object> Get()
    {
        using (var connection = GetConnection())
        {
            connection.Open();

            ...
        }
    } 
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.