Ardalis.Specification C# (.NET): पूर्ण गाइड उदाहरण सहित
C# (.NET) में आधुनिक डेवलपमेंट में, डेटा के साथ काम करने के लिए साफ, टेस्ट करने योग्य और मेंटेन करने योग्य कोड लिखना एक महत्वपूर्ण चुनौती है। Specification पैटर्न एक शक्तिशाली टूल है जो बिजनेस रूल्स और क्वेरी लॉजिक को रीयूज़ेबल, कम्पोज़ेबल और टेस्ट करने योग्य क्लासेस में बदलने में मदद करता है। Ardalis.Specification लाइब्रेरी .NET इकोसिस्टम में इस पैटर्न को लागू करने का डी-फैक्टो स्टैंडर्ड है। यह डेवलपर्स को विशिष्ट ORM (Entity Framework Core, Dapper आदि) से अलग रहकर लचीली डेटा क्वेरी बनाने का एक सुंदर तरीका प्रदान करती है।
इसकी आवश्यकता क्यों है? आमतौर पर, Entity Framework Core का उपयोग करने वाले एप्लिकेशन में क्वेरी लॉजिक कोड में बिखरी रहती है: कंट्रोलर, सर्विसेज और रिपॉजिटरी में। इससे कोड डुप्लिकेशन (जैसे "सक्रिय उपयोगकर्ता" फिल्टर कई जगह दोहराया जाता है), टेस्टिंग में कठिनाई (DbContext को मॉक करना पड़ता है) और कोड की नाजुकता (एक क्वेरी में बदलाव दूसरी को तोड़ सकता है) जैसी समस्याएं होती हैं। Ardalis.Specification इन समस्याओं को हल करती है, यह बताने का एक एकीकृत, स्ट्रॉन्गली टाइप किया गया तरीका प्रदान करती है कि कौन सा डेटा प्राप्त करना है, बिना यह बताए कि वह डेटा कैसे प्राप्त होगा।
यह लाइब्रेरी क्वेरी बनाने के लिए एक समृद्ध API प्रदान करती है: सरल फिल्टरेशन (Where) से लेकर जटिल इन्क्लूज़न (Include, ThenInclude), सॉर्टिंग (OrderBy, ThenBy), पेजिनेशन (Skip, Take) और प्रोजेक्शन (Select) तक। यह Entity Framework Core के साथ पूरी तरह से संगत है (Ardalis.Specification.EntityFrameworkCore पैकेज के माध्यम से), लेकिन इसे अन्य डेटा प्रोवाइडर्स के लिए भी अनुकूलित किया जा सकता है। इसके परिणामस्वरूप, आपका कोड साफ हो जाता है, क्वेरी लॉजिक पुन: प्रयोग करने योग्य हो जाता है, और टेस्टिंग काफी आसान हो जाती है।
इंस्टॉलेशन
लाइब्रेरी को इंस्टॉल करने के लिए NuGet का उपयोग किया जाता है। आपके ORM के आधार पर, आपको मुख्य पैकेज और एक प्रोवाइडर पैकेज इंस्टॉल करना होगा।
# मुख्य पैकेज (बेस क्लासेस और इंटरफेस शामिल हैं)
dotnet add package Ardalis.Specification
# Entity Framework Core के लिए पैकेज (रिपॉजिटरी इम्प्लीमेंटेशन शामिल है)
dotnet add package Ardalis.Specification.EntityFrameworkCore
# यदि आप केवल बेस पैकेज का उपयोग कर रहे हैं (जैसे टेस्ट या कस्टम इम्प्लीमेंटेशन के लिए)
dotnet add package Ardalis.Specification
त्वरित शुरुआत
आइए एक न्यूनतम कार्यशील उदाहरण देखें। मान लीजिए हमारे पास एक Product एंटिटी है और हम उन सभी उत्पादों को प्राप्त करना चाहते हैं जिनकी कीमत 100 से अधिक है।
// 1. एंटिटी को परिभाषित करें
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public decimal Price { get; set; }
public bool IsActive { get; set; }
}
// 2. एक स्पेसिफिकेशन बनाएं
public class ProductsWithPriceGreaterThanSpec : Specification<Product>
{
public ProductsWithPriceGreaterThanSpec(decimal minPrice)
{
Query.Where(p => p.Price > minPrice);
}
}
// 3. रिपॉजिटरी के साथ स्पेसिफिकेशन का उपयोग करें
public class ProductService
{
private readonly IRepositoryBase<Product> _repository;
public ProductService(IRepositoryBase<Product> repository)
{
_repository = repository;
}
public async Task<List<Product>> GetExpensiveProductsAsync(decimal minPrice)
{
var spec = new ProductsWithPriceGreaterThanSpec(minPrice);
return await _repository.ListAsync(spec);
}
}
इस उदाहरण में, हमने एक स्पेसिफिकेशन क्लास बनाया है जो फिल्टरेशन लॉजिक को समाहित करता है। IRepositoryBase रिपॉजिटरी (Ardalis.Specification.EntityFrameworkCore पैकेज से) स्वचालित रूप से इस स्पेसिफिकेशन को आपके DbContext पर लागू करती है और परिणाम लौटाती है। यही इस पैटर्न का सार है: क्वेरी के विवरण को उसके निष्पादन से अलग करना।
मुख्य तरीके और क्लासेस
लाइब्रेरी क्वेरी बनाने के लिए एक शक्तिशाली API प्रदान करती है। आइए मुख्य तरीकों पर नज़र डालें।