Di mana menempatkan koneksi database umum untuk kelas saya


11

Saya memiliki beberapa kelas (Repositori) yang melakukan tugas menyimpan / mengambil beberapa objek di / dari basis data; semuanya perlu membuat koneksi ke satu database.

Saya berpikir untuk menghindari mendefinisikan ulang ConnectionStringdan SqlConnectiondi setiap kelas, melewati koneksi terbuka kepada mereka. Lalu di mana / kapan tempat / waktu terbaik untuk mendefinisikan / membuka koneksi itu dan meneruskannya ke kelas?

Apakah ada pendekatan / pola yang lebih baik untuk memiliki akses ke sumber daya bersama ini?

Jawaban:


10

Melewati koneksi terbuka ke setiap kelas mungkin bukan ide terbaik. Baca Membuat koneksi database - Lakukan sekali atau untuk setiap permintaan?

Ini merekomendasikan untuk membuka dan menutup koneksi per setiap kueri yang ingin Anda jalankan, daripada meneruskan koneksi terbuka ke repositori Anda.

Anda dapat mencoba sesuatu seperti ini untuk membantu Anda mengelola koneksi Anda.

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

Memiliki koneksi terbuka dan meneruskannya di antara kelas umumnya merupakan ide yang buruk. Tentu, membuka koneksi adalah performa yang hebat, tapi itu sudah ditangani oleh pool koneksi dengan menggunakan kembali koneksi yang sudah terbuka. Sebuah komentar: selalu menunggu selama mungkin untuk menelepon connection.Open(), terutama dalam kode multithreaded karena ini akan menetapkan koneksi ke metode Anda (yang berpotensi akan meningkatkan jumlah koneksi terbuka yang dibutuhkan ke database).

Untuk membuat kelas Anda generik mungkin, saya akan merekomendasikan memiliki kelas dasar mengekspos metode dengan IDbConnection, dan repositori Anda akan memiliki implementasi yang lebih umum.

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

            ...
        }
    } 
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.