Ich benutze asp.net Core 2.0 und Dapper. Ich habe eine Klasse, die eine IDbConnection-Schnittstelle umschließt und nur bestimmte Methoden verfügbar macht. Hier ist eine kurze Version dieser Klasse.ConnectionString verloren bei zweiter Ausführung
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); }
}
}
Ich injiziere diese Klasse über einen Konstruktor zu meinen Repository-Diensten. Zum Beispiel ist dies ein Verfahren, das es nennen würde:
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);
}
}
Nun ist das Problem, dass wenn ich _connection.Execute(query, params);
zweimal in einer einzigen Anfrage nennt (2 verschiedene Dienste), ist es das zweite Mal den ConnectionString
Wert innerhalb MyConnectionString
aufgerufen wird Die Klasse ist leer. Ich habe versucht, es in Transient und Request Umfang binden, um zu sehen, ob es es erhalten würde, aber kein Glück. Irgendeine Idee, warum das passiert oder wie kann ich es bewahren, so dass ich nicht die Verbindungszeichenfolge jedes Mal erstellen muss, wenn es angefordert wird?
"ConnectionString-Wert innerhalb der MyConnectionString-Klasse ist leer" ... ConnectionString {get => return null; ... ', wie erwartest du, dass es alles andere als" null "zurückgibt? –
Auch 'using (var con = _connection)' disponiert effektiv die '_connection' nach der ersten Ausführung. – Jasen
Sie sollten stattdessen bei jeder Anfrage eine neue Verbindung erstellen. Es wird kaum Overhead geben, aufgrund des Verbindungs-Pools. Was ist der Zweck der Verwendung einer Fassade, um nur bestimmte Dappers-Methoden zu zeigen? Ich sehe darin keinen Gewinn. –