จะทำการเชื่อมต่อฐานข้อมูลทั่วไปสำหรับชั้นเรียนของฉันได้ที่ไหน


11

ฉันมีหลายคลาส (Repositories) ซึ่งทำหน้าที่ในการบันทึก / ดึงข้อมูลวัตถุบางอย่างใน / จากฐานข้อมูล; พวกเขาทั้งหมดต้องสร้างการเชื่อมต่อกับฐานข้อมูลเดียว

ฉันคิดว่าเพื่อหลีกเลี่ยงการนิยามใหม่ConnectionStringและSqlConnectionในแต่ละชั้นเรียนให้ผ่านการเชื่อมต่อแบบเปิดกับพวกเขา เมื่อใดที่ / เวลาที่ดีที่สุดในการกำหนด / เปิดการเชื่อมต่อนั้นและส่งผ่านไปยังชั้นเรียนคืออะไร?

มีวิธี / รูปแบบที่ดีกว่าในการเข้าถึงทรัพยากรทั่วไปนี้หรือไม่?

คำตอบ:


10

การผ่านการเชื่อมต่อแบบเปิดไปยังแต่ละชั้นอาจไม่ใช่ความคิดที่ดีที่สุด อ่านการสร้างการเชื่อมต่อฐานข้อมูล - ทำเพียงครั้งเดียวหรือแต่ละแบบสอบถาม

แนะนำให้เปิดและปิดการเชื่อมต่อสำหรับแต่ละแบบสอบถามที่คุณต้องการเรียกใช้แทนที่จะส่งผ่านการเชื่อมต่อแบบเปิดไปยังที่เก็บข้อมูลของคุณ

คุณสามารถลองสิ่งนี้เพื่อช่วยในการจัดการการเชื่อมต่อของคุณ

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

การมีการเชื่อมต่อแบบเปิดและส่งผ่านระหว่างชั้นเรียนโดยทั่วไปเป็นความคิดที่ไม่ดี แน่นอนว่าการเปิดการเชื่อมต่อนั้นค่อนข้างได้รับผลกระทบอย่างมาก แต่ก็มีการดูแลโดยพูลการเชื่อมต่อโดยการนำการเชื่อมต่อที่เปิดไว้แล้วกลับมาใช้ใหม่ ข้อสังเกต: โปรดรอให้นานที่สุดเท่าที่จะทำได้connection.Open()โดยเฉพาะอย่างยิ่งในรหัสแบบมัลติเธรดเนื่องจากสิ่งนี้จะกำหนดการเชื่อมต่อกับวิธีการของคุณ (ซึ่งจะเพิ่มจำนวนการเชื่อมต่อที่เปิดไปยังฐานข้อมูล)

เพื่อให้คลาสของคุณเป็นแบบทั่วไปมากที่สุดฉันขอแนะนำให้มีคลาสพื้นฐานที่เปิดเผยเมธอดด้วย IDbConnection และที่เก็บของคุณจะมีการนำไปใช้ที่กว้างกว่า

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

            ...
        }
    } 
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.