मैं सुझाव दूंगा कि आप रिपोजिटरी पैटर्न देखें। एक भंडार पैटर्न के उपयोग के साथ आप अपने आवेदन को आधारभूत संरचना से दूर कर सकते हैं। इसके बाद यह आपको एक या अधिक डेटाबेस, वेब सेवाओं, फ़ाइल सिस्टम या किसी अन्य डेटासोर्स के साथ संवाद करने की अनुमति देगा जो आपके डोमेन के बाहर है और अनुप्रयोगों का प्रत्यक्ष नियंत्रण है। इसके साथ आप एक बुनियादी ढांचा बना सकते हैं जो दृश्यों के पीछे कई डेटा स्रोतों के साथ संवाद कर सकता है। इसका एक उदाहरण एक ईकॉमर्स एप्लिकेशन था जिस पर मैंने हाल ही में काम किया था, जिसने मुझे सीधे उत्पाद सूची के लिए अपने स्थानीय डेटाबेस से बात करने की अनुमति दी लेकिन नए ऑर्डर/खरीद लॉगिंग के लिए दृश्यों के पीछे एसएपी के साथ बात की।
इस के साथ आप कोड है कि भंडार है कि कुछ इस तरह दिखता में कॉल हो सकता है:
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 को बदलने के लिए एक से अधिक कारण हैं!
लेकिन ... यदि आपको यही चाहिए तो ... ऐसा करने का एक तरीका है!
स्रोत
2009-06-27 20:58:57