Ist es akzeptabel, SQLConnection/SQLTransaction in einer injizierten Klasse zu verwalten und zu entsorgen, anstatt AnweiC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Ist es akzeptabel, SQLConnection/SQLTransaction in einer injizierten Klasse zu verwalten und zu entsorgen, anstatt Anwei

Post by Anonymous »

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.

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
}
}
Dies folgt der Anleitung, die Verbindung unmittelbar nach der Verwendung zu entsorgen.

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();
}
}
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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post