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?