Ist es akzeptabel, SQLConnection/SQLTransaction in einer injizierten Klasse zu verwalten und zu entsorgen, anstatt Anwei
Posted: 21 May 2025, 10:45
Ich sehe oft Ratschläge, die empfehlen, dass SQLConnection und SQLTransaction entsorgt werden sollten, sobald Sie sie verwenden, und dass Sie sich nicht auf den Müllkollektor verlassen sollten. Wir erwägen zwei verschiedene Ansätze zur Verwaltung von SQL Server -Verbindungslebensdauer.
Dies folgt der Anleitung, die Verbindung unmittelbar nach der Verwendung zu entsorgen.
Die Schlüsselidee hier ist, dass die SQLMANAGER -Klasse die Verbindung und Transaktion intern hält und verwaltet und mit DI in den Dienst in den Dienst eingeleitet wird. Es implementiert idisposable und wird entweder manuell oder vom DI -Container (abhängig von der Lebenszeitkonfiguration) entsorgt. Sie "?
Mit anderen Worten: Müssen Sie jedes Mal eine Verwendung Anweisung verwenden? Oder ist es akzeptabel, sich auf die Methode von Dispose () einer injizierten Klasse zu verlassen, die die Verbindung intern verwaltet? möglich. Alle Links zum Entsorgungsprozess werden ebenfalls sehr geschätzt. Ich erwartete, dass dies geschehen würde. Meine Frage bleibt gleich. In meiner Frage geht es nicht um , ob zur Entsorgung, sondern um den Zeitpunkt der Entsorgung - speziell für SQLConnection . Wenn im Gegensatz dazu eine Verbindung von einer injizierten Klasse gehalten und nur dazu entsorgt wird, wenn der Dienst selbst entsorgt wird (z. B. am Ende einer Anfrage), bleibt die Verbindung etwas länger geöffnet. Wenn die Leute sagen, dass SQLConnection Objekte entsorgt werden sollten, "sobald Sie mit ihnen fertig sind", handelt es sich bei dieser Anleitung in erster Linie um Effizienz und Ressourcenmanagement, oder es geht mehr darum, dass Verbindungen zuverlässig entsorgt werden, um das Risiko des Vergessens zu vermeiden?
Code: Select all
public class JobService : IJobService
{
public async Task SomeJobMethodAsync()
{
using (var connection = new SqlConnection("..."))
{
await connection.OpenAsync();
// Do some work with the connection
} // connection disposed here
}
}
Code: Select all
public class JobService : IJobService
{
private readonly ISqlManager _sqlManager;
public JobService(ISqlManager sqlManager)
{
_sqlManager = sqlManager;
}
public async Task SomeJobMethodAsync()
{
_sqlManager.PerformOperation(); // does work using an internally-held connection
// no explicit disposal here
}
}
public interface ISqlManager : IDisposable
{
void PerformOperation();
}
public class SqlManager : ISqlManager
{
private readonly SqlConnection _connection;
private readonly SqlTransaction _transaction;
public SqlManager(string connectionString)
{
_connection = new SqlConnection(connectionString);
_connection.Open();
_transaction = _connection.BeginTransaction();
}
public void PerformOperation()
{
using (var cmd = _connection.CreateCommand())
{
cmd.Transaction = _transaction;
cmd.CommandText = "...";
cmd.ExecuteNonQuery();
}
}
public void Dispose()
{
_transaction?.Dispose();
_connection?.Dispose();
}
}
Mit anderen Worten: Müssen Sie jedes Mal eine Verwendung Anweisung verwenden? Oder ist es akzeptabel, sich auf die Methode von Dispose () einer injizierten Klasse zu verlassen, die die Verbindung intern verwaltet? möglich. Alle Links zum Entsorgungsprozess werden ebenfalls sehr geschätzt. Ich erwartete, dass dies geschehen würde. Meine Frage bleibt gleich. In meiner Frage geht es nicht um , ob zur Entsorgung, sondern um den Zeitpunkt der Entsorgung - speziell für SQLConnection . Wenn im Gegensatz dazu eine Verbindung von einer injizierten Klasse gehalten und nur dazu entsorgt wird, wenn der Dienst selbst entsorgt wird (z. B. am Ende einer Anfrage), bleibt die Verbindung etwas länger geöffnet. Wenn die Leute sagen, dass SQLConnection Objekte entsorgt werden sollten, "sobald Sie mit ihnen fertig sind", handelt es sich bei dieser Anleitung in erster Linie um Effizienz und Ressourcenmanagement, oder es geht mehr darum, dass Verbindungen zuverlässig entsorgt werden, um das Risiko des Vergessens zu vermeiden?