इस बिंदु के लिए यहां सभी जगहों पर खेद है ... लेकिन मुझे लगता है कि कुत्ते की तरह मेरी पूंछ का पीछा करते हुए और मैं इस बिंदु पर उलझन में हूं।ओआरएम और परतें
मैं 3 टायर समाधान (आईएल, बीएल, डीएल) विकसित करने का सबसे साफ तरीका देखने की कोशिश कर रहा हूं जहां डीएल एक डीबी के लिए उपयोग करने के लिए ओआरएम का उपयोग कर रहा है।
हर जगह मैंने देखा है, लोग डीबी टेबल्स का प्रतिनिधित्व करने वाली वस्तुओं को उत्पन्न करने के लिए या तो LinqToSQL या LLBLGen Pro का उपयोग करते हैं, और उन सभी वर्गों को उन सभी 3 परतों में संदर्भित करते हैं। लगता है कि 40 साल के कोडिंग पैटर्न को नजरअंदाज कर दिया गया है - या एक प्रतिमान शिफ्ट हुआ है, और मुझे स्पष्टीकरण भाग याद आया कि ऐसा करने के लिए बिल्कुल ठीक क्यों है।
फिर भी, ऐसा प्रतीत होता है कि डेटा भंडारण तंत्र अज्ञेय होने की इच्छा रखने के लिए अभी भी कुछ आधार है - देखो कि लिंककॉएसक्यूएल के साथ क्या हुआ: इसके बारे में बहुत सी कोड लिखा गया था - केवल एमएस के लिए इसे छोड़ने के लिए ... तो मैं ओआरएम भाग को जितना संभव हो उतना अलग करना चाहता हूं, बस यह नहीं जानता कि कैसे।
तो, पूर्ण मूल बातें करने के लिए वापस जा रहा है, यहाँ बुनियादी भागों मैं एक बहुत ही बहुत साफ तरीके से एकत्र कर लें करना चाहते हैं कि इस प्रकार हैं:
विधानसभाओं मैं से शुरू कर रहा हूँ: UL.dll BL.dll DL.dll
मुख्य वर्गों:
एक संदेश वर्ग MessageAddress वस्तुओं की एक संपत्ति उजागर संग्रह (बुलाया MessageAddresses) है:
class Message
{
public MessageAddress From {get;}
public MessageAddresses To {get;}
}
कार्यों परत प्रति:
बीएल यूआई GetMessage (GUID आईडी) जो संदेश का एक उदाहरण देता है कहा जाता है के लिए एक विधि को उजागर करता है।
बीएल बदले में डीएल को लपेटता है।
डीएल में एक प्रदाता फैक्ट्री है जो प्रदाता उदाहरण को लपेटती है। DL.ProviderFactory खुलासा करता है (संभवतः ... मेरे प्रश्नों का हिस्सा) GetMessage (Guid id) नामक दो स्थैतिक विधियों, और SaveMessage (संदेश संदेश) अंतिम लक्ष्य एक प्रदाता को स्वैप करने में सक्षम होना होगा LLBLGen Pro के लिए Linq2SQL के लिए लिखा गया है, या कोई अन्य प्रदाता जो ओआरएम (जैसे VistaDB) के खिलाफ काम नहीं कर रहा है।
डिज़ाइन लक्ष्य: मुझे परत अलगाव चाहिए। मैं चाहता हूं कि प्रत्येक परत केवल इसके नीचे की परत पर निर्भरता हो, इसके बजाय। मैं ओआरएम उत्पन्न वर्गों को केवल डीएल परत में होना चाहता हूं। मैं यूएल को बीएल के साथ संदेश वर्ग साझा करना चाहता हूं।
इसलिए, इस का क्या मतलब है कि:
क) संदेश बीएल ख) DB/Orm/डीबी तालिका के मैनुअल प्रतिनिधित्व में परिभाषित किया गया है ('DbMessageRecord', या 'MessageEntity', या जो कुछ भी बाकी ORM इसे कॉल करता है) डीएल में परिभाषित किया गया है। सी) बीएल पर डीएल डी पर निर्भरता है डी) डीएल विधियों को कॉल करने से पहले, जिन्हें बीएल के बारे में रेफरी या पता नहीं है, बीएल को उन्हें बीएल इकाइयों को परिवर्तित करना है (उदाहरण: डीबीमेसेज रिकार्ड)?
यूएल:
Main()
{
id = 1;
Message m = BL.GetMessage(id);
Console.Write (string.Format("{0} to {1} recipients...", m.From, m.To.Count));
}
बीएल:
static class MessageService
{
public static Message GetMessage(id)
{
DbMessageRecord message = DLManager.GetMessage(id);
DbMessageAddressRecord[] messageAddresses = DLManager.GetMessageAddresses(id);
return MapMessage(message,
}
protected static Message MapMessage(DbMessageRecord dbMessage. DbMessageAddressRecord[] dbAddresses)
{
Message m = new Message(dbMessage.From);
foreach(DbMessageAddressRecord dbAddressRecord in dbAddresses){
m.To.Add(new MessageAddress (dbAddressRecord.Name, dbAddressRecord.Address);
}
}
डीएल:
static class MessageManager
{
public static DbMessageRecord GetMessage(id);
public static DbMessageAddressRecord GetMessageAddresses(id);
}
सवाल: क) जाहिर है यह बहुत काम अभी या बाद में है। बी) अधिक बग सी) धीमी डी) चूंकि बीएल अब डीएल पर निर्भरता है, और डीएल (जैसे डीबीमेसेज रिकार्ड) में कक्षाओं का संदर्भ दे रहा है, ऐसा लगता है कि चूंकि इन्हें ओआरएम द्वारा परिभाषित किया गया है, कि आप एक प्रदाता को बाहर नहीं निकाल सकते हैं, और इसे दूसरे के साथ प्रतिस्थापित करें, ... जो पूरे व्यायाम को व्यर्थ बनाता है ... बीएल के माध्यम से ओआरएम के वर्गों का भी उपयोग कर सकता है। ई) या ... बीएल और डीएल के बीच एक और असेंबली की आवश्यकता है और अंतर्निहित डीएल कक्षाओं से स्वतंत्र बीएल छोड़ने के लिए एक और मानचित्रण की आवश्यकता है।
इच्छा है कि मैं प्रश्न पूछ सकूं ... लेकिन मैं वास्तव में इस बिंदु पर खो गया हूं। किसी भी तरह की सहायता का स्वागत किया जाएगा।
यदि एक प्रतिमान शिफ्ट हुआ है, तो यह या तो लोगों को एहसास हुआ है कि डेटा ट्रांसफर ऑब्जेक्ट्स बहुत शुष्क नहीं हैं, या संभवतः रैवियोली कोड लैसग्ना कोड की तुलना में अधिक लोकप्रिय संरचना बन रहा है। –
मैंने सोचा था कि लैसग्ना कोड सॉफ़्टवेयर स्केलेबल बनाने का एकमात्र तरीका था (व्यक्तिगत रूप से सोचा था कि मुझे नहीं पता होगा क्योंकि मुझे ऐसे पैमाने से निपटना नहीं था)। क्या आप कह रहे हैं कि इसके साथ ही रैवियोली कोड + डब्ल्यूसीएफ के साथ हासिल किया जा सकता है और इसलिए Lasagna कोड परत अलगाव अब इतना महत्वपूर्ण नहीं है? और वैसे भी - कई ओआरएम प्रदाताओं में रैवियोली कोड मॉड्यूलर बनाने का तरीका न देखें। लगता है कि किसी प्रकार की मैपिंग की आवश्यकता है। और आपने मुझे भूख लगी है, बीटीडब्ल्यू। –