7

मैं बस भंडार विधियों को लिखने के बारे में सबसे अच्छा अभ्यास जानना चाहता हूं। समस्या भंडार लिखने का निर्णय ले रही है जिसमें संदर्भ में आलसी लोडिंग नहीं है। यदि आप GetById है तो आप अपनी विधि का नाम कैसे बनाते हैं लेकिन यह स्पष्ट नहीं है कि नेविगेशन में इकाई शामिल है।रिपोजिटरी पैटर्न और नेविगेशन गुण

तो मैं GetUserByIdIncludedPosts जैसे विधि नाम लिखने के बारे में सोच रहा हूं या आलसी लोडिंग सक्रिय संदर्भ का उपयोग करना बेहतर है?

यदि मैं विधि नामों में गुणों को शामिल करता हूं तो कुछ नेविगेशन संपत्ति के लिए वास्तव में कष्टप्रद लंबी विधि नाम होंगे।

उत्तर

2

रिपोजिटरी पैटर्न का उपयोग करने का मतलब यह नहीं है कि आप आलसी लोडिंग का उपयोग करने में सक्षम नहीं होंगे। आप अभी भी इकाई वापस कर सकते हैं जो आलसी को अपनी संबंधित संस्थाओं को लोड करने में सक्षम हो जाएगा। एकमात्र आवश्यकता यह है कि DbContext इकाई लोड करने के लिए उपयोग किया जाना चाहिए "जीवित" होना चाहिए।

लेकिन Martin Fowler द्वारा भंडार की परिभाषा पर एक नजर डालते हैं:

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

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

आप सभी प्रश्नों के लिए इस विधि के साथ शुरू उपयोगकर्ता भंडार करना चाहते हैं: Btw

public interface IRepository<T> 
{ 
    IQueryable<T> GetQuery(); 
} 

। मुझे नहीं लगता कि उपयोगकर्ता पोस्ट के लिए कुल रूट है। ऐसे मामले में अधिकांश अनुप्रयोगों में केवल एक समग्र रूट होगी - एक उपयोगकर्ता।

संपादित करें:

छोटे स्पष्टीकरण: IQueryable डिफ़ॉल्ट रूप से Include विधि प्रदान नहीं करता है।इसे सीटीपी 5 असेंबली में विस्तार विधि के रूप में प्रदान किया जाता है लेकिन यदि आप इसका उपयोग करते हैं तो आप अपनी ऊपरी परत EntityFramework.dll पर निर्भर करेंगे। यह ऐसा कुछ है जिसे आप आमतौर पर नहीं चाहते हैं (कारण आप रिपोजिटरी का उपयोग कर रहे हैं)। तो जाने का तरीका आपकी खुद की विस्तार विधि रैपिंग को परिभाषित करना है जो आपके भंडार के साथ असेंबली में विस्तार प्रदान करता है।

+0

यदि आप अपनी डेटा परत में डेटा संबंधी अपवाद रखना चाहते हैं तो ऐसा न करें। चूंकि प्याज लोडिंग प्याज आर्किटेक्चर प्रिंसिपल की तुलना में एक उच्च परत पर निष्पादित की जाएगी। जिससे सभी तरह के ग़लत व्यवहार होते हैं। यदि आप इस विषय पर किए गए भावुक तर्क को देखना चाहते हैं तो बस अन्य कारण भी हैं, Google 'रिपोजिटरी पैटर्न IQueryable'। – Shadetheartist

2

मैं अपने भंडार आधार वर्ग में निम्नलिखित का उपयोग कर रहा निर्भरता/संबंधों का एक उपयोगकर्ता द्वारा निर्दिष्ट सूची के साथ संस्थाओं की बहाली अनुमति देने के लिए:

protected DbSet<T> Objects { get; private set; } 
protected YourDatabaseContext Context { get; private set; } 

public virtual T GetByID(int id, params string[] children) 
{ 
    if(children == null || children.Length == 0) 
    { 
     return Objects.SingleOrDefault(e => e.ID == id); 
    } 
    DbQuery<T> query = children.Aggregate<string, DbQuery<T>>(Objects, (current, child) => current.Include(child)); 
    return query.SingleOrDefault(e => e.ID == id); 
} 

कोड EF4/CTP5 का उपयोग करता है और इसलिए का उपयोग करता है Db * कक्षाएं , लेकिन वापस सामान्य ईएफ 4 कक्षाओं में परिवर्तित करने के लिए तुच्छ है (उदाहरण के लिए डीबीसेट के बजाय ऑब्जेक्टसेट)।

यह बहुत की तरह इस्तेमाल किया जाएगा:

var product = productsRepository.GetByID(42, "Category", "Orders.OrderLines"); 

जो आप श्रेणी और आदेश सभी आदेशों उनके अवधियाँ बेसब्री से भरी हुई होने के रूप में रूप में अच्छी तरह आबादी के साथ एक उत्पाद लाने होगा।