Sınıflarım için ortak bir veritabanı bağlantısı nereye yerleştirilir


11

Kaydetme / veritabanındaki bazı nesneleri alma görevi yapmak birkaç sınıfları (depolar) var; hepsinin bir veritabanıyla bağlantı kurması gerekir.

Her sınıfta ConnectionStringve SqlConnectionsınıflarını yeniden tanımlamaktan kaçınmak için onlara açık bir bağlantıyı geçmeyi düşündüm . Peki bu bağlantıyı tanımlamak / açmak ve sınıflara aktarmak için en iyi yer / zaman nerededir?

Bu ortak kaynağa erişim için daha iyi yaklaşımlar / kalıplar var mı?

Yanıtlar:


10

Her sınıfa açık bir bağlantı kurmak muhtemelen en iyi fikir değildir. Bir okuma al veritabanı bağlantıları oluşturma - bir veya her bir sorgu için yap?

Açık bağlantıyı deponuza aktarmak yerine, çalıştırmak istediğiniz her sorgu başına bağlantıyı açıp kapatmanızı önerir.

Bağlantılarınızı yönetmenize yardımcı olması için böyle bir şey deneyebilirsiniz.

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
            }
        }
    }
}

5

Açık bir bağlantıya sahip olmak ve sınıflar arasında geçirmek genellikle kötü bir fikirdir. Elbette, bir bağlantı açmak oldukça başarılı bir performanstır, ancak zaten açık bağlantıları yeniden kullanarak bağlantı havuzu tarafından halledilir. Yine de bir açıklama: her zaman aramak için mümkün olduğunca uzun süre bekleyin connection.Open(), özellikle çok iş parçacıklı kodda, çünkü bu yöntem yönteminize bağlantı atayacaktır (veritabanına gerekli açık bağlantı miktarını potansiyel olarak artıracaktır).

Sınıflarınızı olabildiğince genel yapmak için, IDbConnection ile bir yöntem ortaya koyan bir temel sınıf olmasını tavsiye ederim ve depolarınız daha genel bir uygulamaya sahip olacaktır.

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

            ...
        }
    } 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.