1) यदि आप ORM को बंद करना चाहते हैं तो आप क्या करते हैं, यदि आपके पास रिपॉजिटरी में नहीं है तो आपके आवेदन में विशिष्ट ORM कोड होगा।
मैं अभी तक ऐसी स्थिति में नहीं रहा हूँ जहाँ कंपनी ने अचानक डेटा एक्सेस तकनीक को स्विच करने का फैसला किया हो। यदि ऐसा होता है, तो कुछ काम की आवश्यकता होगी। मैं इंटरफेस के माध्यम से डेटा एक्सेस ऑपरेशन को अमूर्त करता हूं। इसे हल करने का एक तरीका है रिपॉजिटरी।
फिर मेरे डेटा एक्सेस लेयर के ठोस कार्यान्वयन के लिए एक अलग असेंबली होगी। उदाहरण के लिए, मेरे पास हो सकता है:
Company.Product.Data
और Company.Product.Data.EntityFramework
विधानसभाएं। पहली असेंबली का उपयोग शुद्ध रूप से इंटरफेस के लिए किया जाएगा, जब दूसरा एंटिटी फ्रेमवर्क के डेटा एक्सेस लॉजिक का एक ठोस कार्यान्वयन होगा।
2) क्या ओआरएम का उपयोग नहीं करने पर रिपॉजिटरी पैटर्न अभी भी मान्य है और आप डेटा एक्सेस और स्वयं ऑब्जेक्ट डेटा को पॉप करने के लिए ADO.net का उपयोग कर रहे हैं?
मुझे लगता है कि यह तय करना आपके लिए है कि कौन सा पैटर्न वैध है या नहीं। मैंने प्रस्तुति परत में एक रिपॉजिटरी पैटर्न का उपयोग किया है। एक बात का ध्यान रखें कि लोग जिम्मेदारियों को रिपॉजिटरी में फेंकना पसंद करते हैं। इससे पहले कि आप इसे जानें, आपकी रिपॉजिटरी क्लास नृत्य, गायन और हर तरह की चीजें करेगी। आप इससे बचना चाहते हैं।
मैंने एक रिपॉजिटरी वर्ग देखा है जो GetAll, GetById, Update और Delete जिम्मेदारियों के होने से शुरू हुआ, जो ठीक है। जब तक यह परियोजना पूरी नहीं हुई, तब तक उसी वर्ग में दर्जनों विधियां (जिम्मेदारियां) थीं, जो कभी नहीं होनी चाहिए थीं। उदाहरण के लिए GetByForename, GetBySurname, UpdateWithExclusions और सभी प्रकार के पागल सामान।
यह वह जगह है जहाँ प्रश्न और आदेश चलन में आते हैं।
3) यदि आप एक ORM का उपयोग करते हैं, लेकिन रिपॉजिटरी पैटर्न का उपयोग नहीं करते हैं जहां आप आमतौर पर उपयोग किए जाने वाले प्रश्नों को रखते हैं। क्या प्रत्येक क्वेरी को एक वर्ग के रूप में प्रस्तुत करना बुद्धिमानी होगी और उदाहरण बनाने के लिए किसी प्रकार का क्वेरी कारखाना होना चाहिए?
मुझे लगता है कि रिपॉजिटरी के बजाय प्रश्नों और कमांड का उपयोग करना एक बहुत अच्छा विचार है। मैं निम्नलिखित कार्य करता हूं:
किसी क्वेरी के लिए इंटरफ़ेस परिभाषित करें। इससे आपको यूनिट टेस्ट में मदद मिलेगी। उदाहरण के लिएpublic interface IGetProductsByCategoryQuery { ... }
एक क्वेरी के लिए ठोस कार्यान्वयन को परिभाषित करें। आप अपनी पसंद के IoC फ्रेमवर्क के माध्यम से इन्हें इंजेक्ट कर पाएंगे। उदाहरण के लिएpublic class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
अब दर्जनों जिम्मेदारियों के साथ रिपॉजिटरी को प्रदूषित करने के बजाय, मैं बस अपने प्रश्नों को नामस्थान में समूहित करता हूं। उदाहरण के लिए, उपरोक्त क्वेरी के लिए एक इंटरफ़ेस में रह सकता है: Company.SolutionName.Products.Queries
और कार्यान्वयन में रह सकता हैCompany.SolutionName.Products.Queries.Implementation
जब डेटा को अपडेट करने या हटाने की बात आती है, तो मैं उसी तरीके से कमांड पैटर्न का उपयोग करता हूं।
कुछ असहमत हो सकते हैं और कह सकते हैं कि परियोजना पूरी होने से पहले आपके पास दर्जनों कक्षाएं और नाम स्थान होंगे। हाँ तुम करोगे। मेरे दिमाग में यह एक अच्छी बात है क्योंकि आप अपनी पसंद के आईडीई में समाधान के माध्यम से ब्राउज़ कर सकते हैं और तुरंत देख सकते हैं कि कुछ घटक किस तरह की जिम्मेदारियां रखते हैं। यदि आपने इसके बजाय एक रिपॉजिटरी पैटर्न का उपयोग करने का निर्णय लिया है, तो आपको प्रत्येक रिपॉजिटरी वर्ग के अंदर अपनी जिम्मेदारियों को पूरा करने की कोशिश करनी होगी।