मेरी कक्षाओं के लिए एक सामान्य डेटाबेस कनेक्शन कहां रखा जाए


11

मेरे पास कई वर्ग (रिपॉजिटरी) हैं जो डेटाबेस में / से कुछ वस्तुओं को बचाने / पुनः प्राप्त करने का कार्य करते हैं; उन सभी को एक डेटाबेस से कनेक्शन स्थापित करने की आवश्यकता है।

मैंने सोचा था कि प्रत्येक वर्ग में 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();

            ...
        }
    } 
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.