Wo soll eine gemeinsame Datenbankverbindung für meine Klassen hergestellt werden?

11

Ich habe mehrere Klassen (Repositorys), die die Aufgabe haben, einige Objekte in / aus der Datenbank zu speichern / abzurufen. Alle müssen eine Verbindung zu einer Datenbank herstellen.

Ich dachte, um zu vermeiden, das ConnectionStringund das SqlConnectionin jeder Klasse neu zu definieren und eine offene Verbindung zu ihnen herzustellen. Wo / wann ist dann der beste Ort / die beste Zeit, um diese Verbindung zu definieren / zu öffnen und an die Klassen weiterzugeben?

Gibt es bessere Ansätze / Muster, um Zugang zu dieser gemeinsamen Ressource zu erhalten?

Ahmad
quelle

Antworten:

10

Es ist wahrscheinlich nicht die beste Idee, eine offene Verbindung zu jeder Klasse herzustellen. Lesen Sie das Erstellen von Datenbankverbindungen - einmal oder für jede Abfrage?

Es wird empfohlen, die Verbindung für jede Abfrage, die Sie ausführen möchten, zu öffnen und zu schließen, anstatt die offene Verbindung an Ihr Repository zu übergeben.

Sie können so etwas versuchen, um Ihre Verbindungen zu verwalten.

public class Repository
{
    private readonly string _connectionString;

    public Repository()
    {
        _connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString
    }

    protected SqlConnection GetConnection()
    {
         return new SqlConnection(_connectionString);
    }


}

public sealed class UserRespository : Repository
{

    public User GetUsers()
    {
        using (var connection = GetConnection())
        {
            using (var commnad = new SqlCommand("SqlQuery", connection))
            {
                //Execute Query
                //Return results
            }
        }
    }
}
Gibson
quelle
5

Eine offene Verbindung zu haben und sie zwischen Klassen weiterzugeben, ist im Allgemeinen eine schlechte Idee. Sicher, das Öffnen einer Verbindung ist ein ziemlicher Leistungseinbruch, aber der Verbindungspool sorgt bereits dafür, dass bereits geöffnete Verbindungen wiederverwendet werden. Eine Bemerkung: Warten Sie immer so lange wie möglich, um aufzurufen connection.Open(), insbesondere bei Multithread-Code, da dadurch die Verbindung Ihrer Methode zugewiesen wird (wodurch möglicherweise die erforderliche Anzahl offener Verbindungen zur Datenbank erhöht wird).

Um Ihre Klassen so allgemein wie möglich zu gestalten, würde ich empfehlen, eine Basisklasse zu haben, die eine Methode mit IDbConnection verfügbar macht, und Ihre Repositorys werden generischer implementiert.

internal abstract class Repository
{
    private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString;

    protected IDbConnection GetConnection()
    {
        return new SqlConnection(ConnectionString);
    }
}

public class MyRepository : Repository
{
    public IEnumerable<object> Get()
    {
        using (var connection = GetConnection())
        {
            connection.Open();

            ...
        }
    } 
}
Richard Jansson
quelle