2009-06-27 22 views
6

मैं एक ऐसे अनुप्रयोग के लिए डेटाबेस फैक्टरी पैटर्न बना रहा हूं जो एसक्लसेवर और ओरेकल के साथ काम करने में सक्षम होना चाहिए।एकाधिक डेटाबेस के साथ डेटाबेस फैक्टरी पैटर्न

http://www.primaryobjects.com/CMS/Article81.aspx

अब, समस्या यह है कि मेरे आवेदन एक ही सर्वर पर विभिन्न डेटाबेस के साथ संचार है: मैं एक समान दृष्टिकोण निम्न आलेख में सुझाव दिया उपयोग किया है। पूर्व में: मैं डेटाबेस डीबी 1 के खिलाफ कुछ प्रश्न पूछ रहा हूं और एसक्यूएल सर्वर पर डीबी 2 के खिलाफ कुछ प्रश्न पूछ रहा हूं। उपर्युक्त आलेख का उपयोग करके, मैं एक डेटाबेस का उदाहरण बना सकता हूं। मैं एकाधिक डेटाबेस के साथ काम करने के लिए एक ही दृष्टिकोण का उपयोग कैसे कर सकता हूं। क्या कोई मेरी इस बारे में मदद कर सकता है? धन्यवाद।

उत्तर

3

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

इस के साथ आप कोड है कि भंडार है कि कुछ इस तरह दिखता में कॉल हो सकता है:

AccountRepository _repository = new AccountRepository(); 
Account account = _repository.GetAccountByID(32); 

या आप की तर्ज पर कुछ कह सकते हैं:

Account account = new AccountRepository().GetAccountByID(32); 

एक के पीछे मूल विचार भंडार यह है कि आपका एप्लिकेशन उस डेटा को प्राप्त करने के लिए कॉल कर सकता है जिसकी आवश्यकता है। यह वास्तविक डोमेन ऑब्जेक्ट्स (जैसे ऊपर दिए गए उदाहरण में एक खाता) वापस कर देगा। या यदि खातों की एक सूची की आवश्यकता है तो यह IEnumerable<Account> वापस कर सकता है।

इस जहां दो datasources से डेटा हड़पने का एक कार्यान्वयन कैसा लग सकता है (हालांकि मैं इस तरह सह mingling चिंताओं का सुझाव नहीं है):

public class AccountRepository 
{ 
    public Account GetAccountByID(int accountID) 
    { 
     Account result = null; 

     using(MyDataContext dc = new ConnectionFactory.GetConnection(Databases.DB1)) 
     { 
      result = dc.Accounts.Where(a=>a.AccountID == accountID).FirstOrDefault(); 
     } 

     //result is null...go to the other database to get an Account 
     if(result == null) 
     { 
      using(MyDataContext dc = new ConnectionFactory.GetConnection(Databases.DB2)) 
      { 
       result = dc.Accounts.Where(a=>a.AccountID == accountID).FirstOrDefault(); 
      } 
     } 

     return result; 
    } 
} 

इस जैसे एक स्थिति के लिए मेरी प्राथमिकता होगी एक एप्लिकेशन सेवा परत बनाने के लिए जो अनुप्रयोग तर्क को संभालती है। एक भंडार तकनीकी रूप से एक डेटा स्रोत से चिंतित होना चाहिए। इसके बाद आप जोड़े के विभिन्न डेटा स्रोतों के लिए कुछ अलग भंडार रख सकते हैं। आपकी एप्लिकेशन परत में फिर GetAccountByID को रिपोजिटरी 1 (डेटाबेस 1) से प्राप्त करने के लिए नया होगा और यदि यह शून्य था ... तो अनुप्रयोग परत फिर दूसरी रिपॉजिटरी (उदाहरण के लिए डेटाबेस 2) में डुबकी जाएगी। अगर संभव हो तो भंडार को सोलिड सिद्धांतों का पालन करना चाहिए। जहां मेरा उदाहरण स्पष्ट रूप से SOLID दृष्टिकोण को तोड़ता है, यह है कि GetAccountByID को बदलने के लिए एक से अधिक कारण हैं!

लेकिन ... यदि आपको यही चाहिए तो ... ऐसा करने का एक तरीका है!

संबंधित मुद्दे