2009-09-21 14 views
7

Wikipedia बताता है कि विशिष्टता पैटर्न वह जगह है जहां व्यवसाय तर्क को बूलियन तर्क का उपयोग करके व्यापार तर्क को एक साथ जोड़कर पुन: संयोजित किया जा सकता है। सूचियों या संग्रहों से फ़िल्टरिंग ऑब्जेक्ट्स को चुनने के संबंध में मुझे लगता है कि डायनामिक LINQ मुझे एक ही चीज़ को पूरा करने की अनुमति देता है। क्या मैं कुछ भूल रहा हूँ? क्या विनिर्देश पैटर्न के लिए अन्य लाभ हैं जिन्हें भी माना जाना चाहिए?जब आप गतिशील LINQ का उपयोग कर सकते हैं तो विशिष्टता पैटर्न अप्रचलित है?


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

मैं कुछ पदों कि LINQ और विशिष्टता पैटर्न के संयोजन पर चर्चा मिल गया है:

Linq Specifications Project

Implementing the Specification Pattern via Linq by Nicloas Blumhardt (Autofac dude)

किसी को भी इस सड़क से किया गया है और किया यह बनाए रखने के लिए जटिल हो गया?

+0

मुझे अभी इस सटीक स्थिति का सामना करना पड़ रहा है, इसलिए यह सवाल मेरे लिए बहुत रूचिपूर्ण है। –

उत्तर

2

डायनामिक LINQ गतिशील क्वेरी निर्माण की अनुमति देने के लिए स्ट्रिंग एक्सप्रेशन का उपयोग करता है। इसलिए हम वास्तव में वहां प्रकार की सुरक्षा खो देते हैं। जबकि सजावटी पैटर्न जैसे सजावटी पैटर्न का उपयोग निकटता से संबंधित अवतार, विनिर्देश पैटर्न, हमें कोड में प्रकार की सुरक्षा को बनाए रखने की अनुमति देता है। मैं पुन: उपयोग और गतिशील रूप से प्रश्नों का निर्माण करने के लिए क्वेरी रैपर के रूप में सजावटी पैटर्न का उपयोग करके पता लगाता हूं। आप कोड प्रोजेक्ट पर आलेख यहां प्राप्त कर सकते हैं: Linq Query Wrappers

या आप मेरी blog देख सकते हैं।

5

मैं एक सी # डेवलपर हूं और विनिर्देश पैटर्न का उपयोग करना चाहता हूं, क्योंकि यह मेरे व्यवसाय डोमेन के करीब है। इसके अलावा, यदि आप एक विनिर्देश वर्ग मौजूद हैं, तो आपको इस पैटर्न के साथ कोई आश्चर्य नहीं है, इसे काम करना चाहिए। लिंक के साथ, आपके अंतर्निहित प्रदाता ने कुछ विशेषताओं को लागू नहीं किया है, और आप इसे रनटाइम तक नहीं जान पाएंगे।

लेकिन निश्चित रूप से, linq पर विनिर्देश का सबसे बड़ा लाभ व्यापार के करीब होना है, यह एक छोटा डीएसएल है। मेरे लिए LINQ संग्रह क्वेरी के लिए एक डीएसएल है, न कि व्यवसाय डोमेन के लिए।

1

मुझे वास्तव में LINQ नहीं पता है, लेकिन ऐसा लगता है कि सामान्य रूप से एक घोषणात्मक क्वेरी सिस्टम विनिर्देश पैटर्न से संबंधित है। विशेष रूप से, ऑब्जेक्ट उन्मुख वातावरण में वस्तुओं को एक साथ लिखकर एक घोषणात्मक क्वेरी सिस्टम को कार्यान्वित करना। आईआईआरसी जो LINQ करता है, सिंटैक्टिक चीनी की एक परत प्रदान करता है।

क्या LINQ पूरी तरह से पैटर्न को अप्रचलित करता है, मैं नहीं बता सकता। शायद ऐसे कोने के मामले हैं जिन्हें LINQ में व्यक्त नहीं किया जा सकता है?

0

LINQ:

var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList(); 

विशिष्टता:

var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList(); 
  • व्यापार तर्क विनिर्देश में encapsuled (एक नाम के साथ कि पता चलता है कि यह क्या है) है।
  • DRY: यदि आप कोड पर है कि LINQ दोहराने नहीं है, तो आप सिर्फ विशिष्टता

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

उदाहरण:

public class Customer 
{ 
    //... 

    public bool IsAbleToReceiveCredit(decimal creditValue) 
    { 
     var secureAge = this.Age > 18 && this.Age < 60; 
     var personalAssetsGreaterThanCreditValue = this.PersonalAssets.Sum(x => x.Value) > creditValue; 

     return secureAge && personalAssetsGreaterThanCreditValue; 
    } 
} 

अगर उसे कुछ क्रेडिट प्राप्त करने में सक्षम है तय करने के लिए Customerफ्रॅन्स से यह है?

शायद नहीं।

तो विनिर्देश के साथ आप उस तर्क को Customer से हटा सकते हैं (यह कभी इसका नहीं था)। आप IsAbleToReceiveCreditSpecification जैसे कुछ बना सकते हैं और वहां सभी तर्क डाल सकते हैं। हम आगे जा सकते हैं और विनिर्देशों को जोड़ सकते हैं, उदाहरण के लिए: आप SecureAgeSpecification और AssetsGreaterThanSpecification बना सकते हैं और IsAbleToReceiveCreditSpecification लिखने के लिए उनका उपयोग कर सकते हैं।

इसलिए मुझे नहीं लगता कि LINQ विशिष्टता को प्रतिस्थापित करता है। वास्तव में यह पैटर्न में सुधार करता है। विशिष्टता के कुछ कार्यान्वयन हैं जो LINQ आंतरिक रूप से IQueriable<T> के साथ उपयोग करते हैं, इसके साथ आप रिपोजिटरी/डेटाएस स्तर पर अपने ORM प्रश्नों के अंदर विनिर्देश का उपयोग कर सकते हैं।