私はasp.net core 2.0とdapperを使用しています。 IDbConnectionインターフェイスをラップし、特定のメソッドのみを公開するクラスがあります。ここにそのクラスの短いバージョンがあります。2番目の実行時にConnectionStringが失われる
public class MyConnectionString : IMyConnectionString
{
private readonly IDbConnection _connection;
public int ConnectionTimeout => _connection.ConnectionTimeout;
public string Database => _connection.Database;
public string ConnectionString { get => null; set => _connection.ConnectionString = value; }
public ConnectionState State => _connection.State;
public MyConnectionString(IOptions<ConnectionProviderOptions> connProvOpts, EncryptionHelper encHelper)
{
var con = "some logic to get the connection string.";
_connection = new SqlConnection(con);
}
public int Execute(string query, object parameters = null)
{
using (var con = _connection) { return con.Execute(query, parameters); }
}
}
私はこのクラスをコンストラクタを介してリポジトリサービスに注入しています。たとえば、これはそれを呼ぶだろう方法である:
internal class SomeRepository
{
private readonly IMyConnectionString _connection;
public SomeRepository(IMyConnectionString connection)
{
_connection = connection;
}
public void ExecuteSomeQuery(Object params)
{
var query = "Some query...";
_connection.Execute(query, params);
}
}
今の問題は、私は単一の要求(2つの異なるサービス)で二回_connection.Execute(query, params);
を呼び出す場合、それを取得二度目はMyConnectionString
内ConnectionString
値と呼ばれるということですクラスは空です。私はTransientとRequestスコープでバインドして、それを保存するかどうかを確認しましたが、運はありません。なぜこのようなことが起こっているのか、どのように私はそれを保存して、要求されるたびに接続文字列を作成する必要がないのでしょうか?
"MyConnectionStringクラス内のConnectionString値が空です" ... "ConnectionString {get => nullを返します。 ... '、あなたはそれが'ヌル '以外のものを返すとどう思いますか? –
また 'using(var con = _connection)'は、最初の実行後に '_connection'を効果的に破棄します。 – Jasen
代わりに、すべての要求に対して新しい接続を作成する必要があります。接続プーリングに起因するオーバーヘッドはほとんどありません。また、特定のDappersメソッドのみを公開するためにファサードを使用する目的は何ですか?私はこれで何の利益も見ません。 –