Nơi đặt kết nối cơ sở dữ liệu chung cho các lớp của tôi


11

Tôi có một số lớp (Kho lưu trữ) thực hiện nhiệm vụ lưu / truy xuất một số đối tượng trong / từ cơ sở dữ liệu; tất cả trong số họ cần thiết lập một kết nối đến một cơ sở dữ liệu.

Tôi nghĩ để tránh xác định lại ConnectionStringSqlConnectiontrong mỗi lớp, truyền một kết nối mở cho họ. Sau đó, nơi / khi nào là nơi / thời gian tốt nhất để xác định / mở kết nối đó và chuyển nó đến các lớp?

Có cách tiếp cận / mô hình tốt hơn để có quyền truy cập vào tài nguyên chung này không?

Câu trả lời:


10

Vượt qua một kết nối mở cho mỗi lớp có lẽ không phải là ý tưởng tốt nhất. Hãy đọc phần Tạo kết nối cơ sở dữ liệu - Thực hiện một lần hoặc cho mỗi truy vấn?

Nó khuyên bạn nên mở và đóng kết nối cho mỗi truy vấn bạn muốn chạy, thay vì chuyển kết nối mở vào kho lưu trữ của bạn.

Bạn có thể thử một cái gì đó như thế này để giúp bạn quản lý các kết nối của bạn.

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

Có một kết nối mở và chuyển nó giữa các lớp nói chung là một ý tưởng tồi. Chắc chắn, việc mở một kết nối khá là hiệu quả, nhưng điều đó đã được nhóm kết nối quan tâm bằng cách sử dụng lại các kết nối đã mở. Mặc dù vậy, có một lưu ý: luôn chờ càng lâu càng tốt để gọi connection.Open(), đặc biệt là trong mã đa luồng vì điều này sẽ chỉ định kết nối cho phương thức của bạn (sẽ tăng thêm số lượng kết nối mở cần thiết cho cơ sở dữ liệu).

Để làm cho các lớp của bạn chung chung nhất có thể, tôi khuyên bạn nên có một lớp cơ sở trưng ra một phương thức với IDbConnection và các kho lưu trữ của bạn sẽ có một triển khai chung hơn.

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

            ...
        }
    } 
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.