回答:
各クラスにオープン接続を渡すことは、おそらく最良のアイデアではありません。データベース接続の作成を読んでください-それは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
}
}
}
}
一般に、接続を開いてクラス間で渡すことはお勧めできません。確かに、接続を開くことはパフォーマンスに大きな影響を与えますが、すでに開かれている接続を再利用することで、接続プールによってすでに対処されています。ただし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();
...
}
}
}