2011-08-05 30 views
7

मुझे कहना है, मैं निष्कर्ष पर आया हूं (बहुत सारे परीक्षण के बाद) कि रिपोजिटरी & इकाई फ्रेमवर्क का उपयोग करते समय कार्य की इकाई केवल गलत, गलत, गलत और this says why है।रिपोजिटरी के बिना इकाई फ्रेमवर्क में पुन: प्रयोज्य क्वेरीिंग। कैसे?

लेकिन मुझे वास्तव में उन एम्बेडेड प्रश्नों से नफरत है। सवाल यह है कि, अगर मैं रिपोजिटरी के खिलाफ हूं, तो मैं उन्हें कहां रख सकता हूं? (केवल साफ जवाब कृपया, उदाहरणों की बहुत सराहना की)।

मैंने फाइलों के सैकड़ों के साथ मेरी रिपोजिटरी, काम की इकाई और इंटरफेस वाली दो परियोजनाओं को सिर्फ दो परियोजनाओं को नियुक्त किया क्योंकि भुगतान कहीं भी नहीं देखा गया था। मुझे लगता है कि बहुत सारे लोग, खुद को शामिल करते हैं, बस रिपोजिटरी बैंडवागन पर कूद गए क्योंकि यही वह सब कुछ कर रहा था लेकिन पीछे की ओर, मुझे लगता है कि यह वास्तव में कहीं भी सवारी नहीं है।

/विलाप

रिचर्ड

उत्तर

3

कहाँ तुम उन्हें डाल करने की उम्मीद करते हैं?

  1. उन्हें हो कि वे कहाँ हैं और कस्टम विस्तार के तरीकों, query views, मैप किए गए डेटाबेस विचारों या कस्टम defining queries का उपयोग पुन: प्रयोज्य भागों
  2. परिभाषित करने के लिए कुछ अलग वर्ग पर विधि के रूप में हर एक क्वेरी का पर्दाफाश करते हैं: आप केवल कुछ विकल्प हैं। विधि IQueryable का पर्दाफाश नहीं करना चाहिए और Expression को स्वीकार नहीं करना चाहिए क्योंकि पैरामीटर = संपूर्ण क्वेरी तर्क विधि में लपेटा जाना चाहिए। लेकिन यह आपकी कक्षा को संबंधित विधियों को भंडार की तरह ढकेल देगा (केवल एक जिसे मजाक किया जा सकता है या फिक किया जा सकता है)। यह कार्यान्वयन संग्रहीत प्रक्रियाओं के साथ प्रयुक्त कार्यान्वयन के करीब है।
  3. आप पिछले विधि के समान ही करेंगे, लेकिन अलग-अलग वर्ग में प्रश्न रखने के बजाय आप उन्हें सीधे इकाई के लिए स्थिर तरीके के रूप में रखेंगे। यह बहुत खराब परीक्षण योग्य है क्योंकि स्थैतिक तरीकों को मॉकिंग द्वारा प्रतिस्थापित नहीं किया जा सकता है (इसे अधिक जटिल परीक्षण ढांचे की आवश्यकता होती है)। यह active record pattern का हिस्सा है जहां प्रत्येक इकाई लोडिंग और डेटाबेस में सहेजने के लिए ज़िम्मेदार है। कस्टम विस्तार विधि का

उदाहरण:

public static IQueryable<TEntity> GetByName(this IQueryalbe<TEntity> query, string name) 
    where TEntity : IEntityWithName 
{ 
    return query.Where(e => e.Name == name); 
} 

कस्टम वर्ग को उजागर तरीकों का उदाहरण:

public class QueryProvider 
{ 
    public QueryProvider() {} 

    public IEnumerable<TEntity> GetByName(IYourContext context, string name) 
     where TEntity : IEntityWithName 
    { 
     return context.CreateObjectSet<TEntity>().Where(e => e.Name == name).ToList(); 
    } 
} 
+0

इकाई फ्रेमवर्क और परीक्षण मेरे विचार में एक निकट ऑक्सीमोरॉन है लेकिन मुझे पता है कि आपका क्या मतलब है। जैसे ही चीजें जटिल हो जाती हैं, ऊपर के दृष्टिकोण अलग हो जाते हैं लेकिन जैसा कि आप कहते हैं, और क्या है?इसे एक भंडार में लपेटकर बस कहीं और दोष को स्थानांतरित कर रहा है। – Richard

2

Build Reusable, Testable Queries Part 1

यह एक ब्लॉग पोस्ट मैं पुन: प्रयोज्य प्रश्नों के निर्माण के बारे में लिखा है। एक्सटेंशन विधियों का उपयोग करने से आप संगत क्वेरी तैयार कर सकते हैं।

विनिर्देश पैटर्न जैसे पैटर्न का उपयोग करके आप उन प्रश्नों को बनाने में मदद कर सकते हैं जिन्हें पुन: उपयोग या सहेजा जा सकता है (क्रमबद्ध)। यदि आपके पास डबल एंट्री सिस्टम है तो आप दो अलग-अलग डेटाबेस पर एक ही क्वेरी इंस्टेंस निष्पादित कर सकते हैं।

निम्नलिखित उदाहरण ईएफ का उपयोग नहीं करता है लेकिन ईएफ संदर्भ द्वारा आईनेमेरेबल को प्रतिस्थापित करता है और आप जो कह रहे हैं उसे प्राप्त करते हैं। पैरामीटर कन्स्ट्रक्टर के माध्यम से पारित कर रहे हैं।

public class PartialMatchQuery : IModelQuery<string, IEnumerable<string>> 
{ 
    private readonly string partial; 

    public PartialMatchQuery(string partialString) 
    { 
     partial = partialString; 
    } 

    public IEnumerable<string> Execute(IEnumerable<string> model) 
    { 
     return model.Where(s => s.ToLower().Contains(partial)); 
    } 
} 
संबंधित मुद्दे