2010-03-16 13 views
6

से सी # में वस्तुओं की एक सामान्य सूची को भरने के लिए कैसे मैं सिर्फ सीख रहा हूँ ASP.NET सी # और मेरे अनुप्रयोगों में सर्वोत्तम प्रथाओं को शामिल करने की कोशिश कर रहा। जो कुछ भी मैंने पढ़ा है, वह चिंताओं को अलग करने के आधार पर मेरे अनुप्रयोगों को डीएएल, बीएलएल, यूआई आदि में ले जाने के लिए कहता है। चारों ओर डेटाटेबल्स को पास करने के बजाय, मैं कस्टम ऑब्जेक्ट्स का उपयोग करने के बारे में सोच रहा हूं ताकि मैं अपनी डेटा परत से कम हो जाऊं और वीएस में इंटेलिजेंस का लाभ उठा सकूं। मुझे लगता है कि इन वस्तुओं को डीटीओ माना जाएगा?SQL डेटाबेस

पहले, जहां इन वस्तुओं मेरी परतों पर रहती है? बीएलएल, डीएएल, अन्य?

दूसरा, एसक्यूएल से पॉप्युलेट करते समय, क्या मुझे सूची को पॉप्युलेट करने के लिए डेटा रीडर के माध्यम से लूप करना चाहिए या पहले डेटा टेबल भरना चाहिए, फिर सूची को पॉप्युलेट करने के लिए तालिका के माध्यम से लूप करना चाहिए? मुझे पता है कि आपको जितनी जल्दी हो सके डेटाबेस कनेक्शन बंद करना चाहिए, लेकिन यह डेटा तालिका को पॉप्युलेट करने के लिए और अधिक ओवरहेड की तरह लगता है और उसके बाद सूची के लिए लूप करें।

तीसरा, सब कुछ मैं इन दिनों देखने Linq2SQL का उपयोग कहते हैं। मैं Linq2SQL सीखने की योजना बना रहा हूं, लेकिन इस समय मैं एक विरासत डेटाबेस के साथ काम कर रहा हूं जिसमें विदेशी कुंजी सेटअप नहीं है और मेरे पास इसे ठीक करने की क्षमता नहीं है। इसके अलावा, मैं nHibernate जैसे ओआरएम समाधान में आने से पहले सी # के बारे में अधिक जानना चाहता हूं। उसी समय मैं प्रत्येक क्वेरी के लिए सभी कनेक्शन और एसक्यूएल नलसाजी टाइप नहीं करना चाहता हूं। क्या अब एंटरप्राइज़ डीएएबी का उपयोग करना ठीक है?

उत्तर

17

आपके पास एक प्रश्न में बहुत सारे प्रश्न हैं।

लिंक 2 एसक्यूएल सिर्फ एक ओआरएम प्रकार है, यदि आप उस मार्ग पर जा रहे हैं तो मैं इकाई ढांचे (माइक्रोसॉफ्ट के ओआरएम) को देखता हूं।

आइए स्तरित अनुप्रयोगों के बारे में बात करते हैं एक सा तरीका समझने में वस्तुओं को भरने के लिए मदद करने के लिए। आपका सामान्य डेटाबेस ऐप 3 परतों से बना है (कुछ कहते हैं 4 और डेटाबेस को खुद को एक परत के रूप में संदर्भित करते हैं, यह वास्तव में कोई फर्क नहीं पड़ता)।

  • यूआई
  • BLL
  • दाल

तो अपने संचार BLL और दाल को BLL वार्ता करने के लिए यूआई वार्ता है: आप निम्नलिखित है। डीएएल कुछ डेटा बीएलएल को देता है जो बदले में इसे यूआई में पेश करता है। मुझे नहीं पता कि कौन आपको बताता है कि डेटासेट/टेबल खराब हैं ... सुनिश्चित करें कि एक पाठक तेज़ है लेकिन इसका मतलब यह नहीं है कि डेटाटेबल का उपयोग करना बुरा है।

मुझे आपको एक उदाहरण दें। एक साधारण वर्ग के रूप में अपने डीएएल के बारे में सोचना बंद करो। अलग-अलग वर्गों के पूरे फ़ोल्डर के रूप में डीएएल परत के बारे में सोचना शुरू करें। उन वर्गों में से एक एक स्थिर डीबी कक्षा है। यह स्थिर है क्योंकि आप एक डेटाबेस (ज्यादातर मामलों में) से निपट रहे हैं, इसलिए कक्षा को तुरंत चालू करने की आवश्यकता नहीं है। तो यह कुछ ऐसा दिखाई देगा:

public static class DB { 
private static readonly string connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; 
private static readonly DbProviderFactory factory = DbProviderFactories.GetFactory(dataProvider); 

public static int Update(string sql) 
     { 
      using (DbConnection connection = factory.CreateConnection()) 
      { 
       connection.ConnectionString = connectionString; 

       using (DbCommand command = factory.CreateCommand()) 
       { 
        command.Connection = connection; 
        command.CommandText = sql; 

        connection.Open(); 
        return command.ExecuteNonQuery(); 
       } 
      } 
     } 

public static DataTable GetDataTable(string sql) 
     { 
      using (DbConnection connection = factory.CreateConnection()) 
      { 
       connection.ConnectionString = connectionString; 

       using (DbCommand command = factory.CreateCommand()) 
       { 
        command.Connection = connection; 
        command.CommandType = CommandType.Text; 
        command.CommandText = sql; 

        using (DbDataAdapter adapter = factory.CreateDataAdapter()) 
        { 
         adapter.SelectCommand = command; 

         DataTable dt = new DataTable(); 
         adapter.Fill(dt); 

         return dt; 
        } 
       } 
      } 
} 

इनमें से कुछ dofactory वेबसाइट से लिया गया है। डिजाइन पैटर्न का उपयोग कैसे करें सीखने के लिए महान संसाधन। किसी भी तरह यह सिर्फ एक .class फ़ाइल है। अब आपको एक ग्राहक डीओ (एक ग्राहक डेटा एक्सेस ऑब्जेक्ट) कहने के लिए एक और की आवश्यकता है।

ठीक है तो आप अपने द्वारा बनाई गई डीबी कक्षा का उपयोग कैसे कर सकते हैं (अच्छी तरह से मैं स्पॉक्स के संयोजन का उपयोग करता हूं लेकिन इसे एक साधारण पोस्ट बनाने के लिए अब संग्रहित प्रक्रियाओं से बचने देता है)। अगर मुझे ग्राहकों को प्राप्त करने की ज़रूरत है तो मैं इसे परिभाषित कर सकता हूं:

public IList<Customer> GetCustomers() 
{ 
    StringBuilder sql = new StringBuilder(); 
    sql.Append(" SELECT CustomerId, CompanyName, City, Country "); 
    sql.Append(" FROM Customer "); 

    DataTable dt = Db.GetDataTable(sql.ToString()); 

    return MakeCustomers(dt); 
} 

याद रखें कि यह पूरी तरह से अलग है। क्लास फ़ाइल में है।ठीक है तो ग्राहकों को कैसे दिखता है:

private IList<Customer> MakeCustomers(DataTable dt) 
     { 
      IList<Customer> list = new List<Customer>(); 
      foreach (DataRow row in dt.Rows) 
       list.Add(MakeCustomer(row)); 

      return list; 
     } 

तो मैं यहां क्या कर रहा हूं, मेरे पास ग्राहकों से भरा एक डाटाटेबल था। मैं datatable की प्रत्येक पंक्ति के माध्यम से लूप करने की जरूरत है और ग्राहक करें:

private Customer MakeCustomer(DataRow row) 
     { 
      int customerId = int.Parse(row["CustomerId"].ToString()); 
      string company = row["CompanyName"].ToString(); 
      string city = row["City"].ToString(); 
      string country = row["Country"].ToString(); 

      return new Customer(customerId, company, city, country); 
     } 

तो यह ग्राहक new'd और एक ग्राहक सूची में संग्रहित है।

यह आपके डेटा एक्सेस लेयर का क्या एक छोटा सा उदाहरण है। डाटाबेस क्लास केवल डेटा स्ट्रिंग प्राप्त करने या डेटा टेबल प्राप्त करने के लिए कनेक्शन स्ट्रिंग और फ़ंक्शंस को स्टोर करता है या यहां तक ​​कि आपके मामले में डेटा रीडर प्राप्त करता है (जो आप भी कर सकते हैं)। ग्राहक डीडीओ कक्षा केवल एक वर्ग है जो ग्राहक वस्तुओं से संबंधित है और एक आईसी कस्टमर इंटरफेस कह सकता है।

तो ग्राहक वर्ग कहां है? यह व्यापार परत के रूप में एक और फ़ोल्डर में हो सकता है, क्योंकि यह केवल एक व्यापार वस्तु है। यहां आप ग्राहक वर्ग के अंदर सत्यापन, और आवश्यक फ़ील्ड सेट कर सकते हैं।

आपके यूआई में डेटावेयर, डेटासेट या एसक्यूएल से संबंधित कुछ भी नहीं है। आपकी बिजनेस लेयर के पास इसके साथ कुछ लेना देना नहीं है (यह आपके व्यावसायिक ऑब्जेक्ट्स के पीछे कुछ नियम परिभाषित करता है)। आपका दाल बहुत लचीला हो सकता है (एसक्यूएल, ओरेकल, आदि के साथ काम कर सकता है) या एसक्यूएल सर्वर कहने तक सीमित हो सकता है यदि आप यही करने की योजना बना रहे हैं। अपने ऐप को ओवरकिल न करें। यदि आप एक एमएस लड़के हैं और केवल SQL सर्वर का उपयोग करने के लिए निश्चित हैं, तो किसी भी विक्रेता के साथ काम करने वाले अंतिम डीएएल को रोल करने का प्रयास करके अपनी नौकरी को मुश्किल न बनाएं। SQLCommand, SQLConnection, आदि का उपयोग करना ठीक है

+0

आप ग्राहकों को एक साथ जोड़ने, ग्राहकों को बनाने, ग्राहक को एक ही विधि में क्यों नहीं जोड़ेंगे? – jpshook

+0

@ डेवलपर - तो आपके पास एक बड़ा बदसूरत फ़ंक्शन होगा। आपको चिंताओं को अलग करने की जरूरत है ताकि आप किसी फ़ंक्शन को जटिल न करें। एक समारोह बस * एक * नौकरी/कार्य करना चाहिए। यदि मैं इसे सभी में डालता हूं, तो आप ग्राहकों को प्राप्त कर रहे होंगे, साथ ही ग्राहकों के माध्यम से लांचिंग/लूपिग करेंगे, साथ ही ग्राहक को स्थान आवंटित करके ग्राहक को नया कर सकते हैं, साथ ही ग्राहक ऑब्जेक्ट को मान असाइन कर सकते हैं और आखिर में ग्राहक को सूची में जोड़ सकते हैं। आप इसे सब एक में कर सकते हैं लेकिन यह आपके कार्य को जटिल बनाता है। मेरे उदाहरण में पठनीयता भी अधिक सरल है। – JonH

+0

डीबी कक्षा में सही तरीके से अद्यतन विधि में पैरामीटर कैसे जोड़ेंगे? मुझे नहीं लगता, आप ऐसा करेंगे: डीबी। अद्यतन ("तालिका सेट उपयोगकर्ता नाम = '" + varusername + "' कहां x =" + varx + "); ... तो क्या आप एक SQLCommand के साथ पास करेंगे पैरामीटर या डिक्शनरी या की/वैल्यू सूची के साथ और अद्यतन विधि में sqlcommand का निर्माण करें। मुझे लगता है कि विधि की उपयोगिता को यथासंभव व्यापक/सामान्य माना जाता है। – Jesper

0

टेलीरिक के ओपनएप ओआरएम देखें। आपको इसे "ओआरएम" के रूप में उपयोग करने की ज़रूरत नहीं है, लेकिन यह आपको इसे टाइप करने के बिना अपनी टेबल के लिए कक्षाएं त्वरित रूप से उत्पन्न करने की क्षमता प्रदान करेगी। फिर आप अपने डीएएल में इन मजबूत टाइप किए गए वर्गों का उपयोग जो कुछ भी चाहते हैं, उसके लिए कस्टम-लिखित या ओआरएम-आधारित कुछ और के साथ कर सकते हैं। इस मामले में, आप इसे जल्दी से शुरू करने के लिए कोड जनरेशन के लिए इसका उपयोग कर रहे हैं (और ये ऑब्जेक्ट्स बहुत ही बुनियादी और सरल हैं - यानी, अगर आप उन्हें लिखना चाहते हैं तो आप कहां से शुरू करेंगे)।

अपनी अन्य वस्तुओं से अपने डीएएल ऑब्जेक्ट्स को सारणित करने के लिए, डब्ल्यूसीएफ देखें। आप इसे प्रत्येक परत (यूआई/बिज़/डीएएल) के बीच में डाल सकते हैं और यह प्रॉक्सी ऑब्जेक्ट्स उत्पन्न करेगा जो आपकी चिंताओं को अलग करने का ख्याल रखेगा।