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 प्रश्नों के अंदर विनिर्देश का उपयोग कर सकते हैं।
मुझे अभी इस सटीक स्थिति का सामना करना पड़ रहा है, इसलिए यह सवाल मेरे लिए बहुत रूचिपूर्ण है। –