आप एक समग्र रूट की गणना करने के लिए एक रिपोजिटरी का उपयोग करते हैं। अक्सर पर्याप्त, आपके नियंत्रक एक समग्र रूट के साथ काम करते हैं, जिसे आप फ़िल्टर कर सकते हैं, सॉर्ट इत्यादि। उपयोगकर्ता को आवश्यकता होती है।
इसलिए, मैं पहले से ही उल्लेख किया गया है कि लाइनों के साथ एक भंडार का उपयोग करें।
हालांकि, कभी-कभी मुझे अधिक जटिल विनिर्देशों के भीतर काम करने की आवश्यकता होती है, जहां कुल रूट और/या भंडारों का पूरा समूह उपयोग करना दर्दनाक, अक्षम, या बस संभव नहीं है। उदाहरण के लिए, आपको एक बड़ी व्यावसायिक रिपोर्ट चलाने की आवश्यकता हो सकती है, या शायद बैच कमांड निष्पादित करना पड़ सकता है।
मामलों के इन प्रकार में, मैं भी ICommand
/IQuery
परिभाषित किया है, एक राष्ट्रीय राजमार्ग आधार कार्यान्वयन के साथ (जैसा कोई सामान्य Repository
करता है) पाइपलाइन सामान की देखभाल करने के लिए।
मैं जो करता हूं वह एक इंटरफ़ेस बनाता है जो विनिर्देश के लिए अनुबंध का प्रतिनिधित्व करता है, किसी भी सदस्यों को उजागर करने के लिए मुझे आवश्यक पैरामीटर बनाने में मदद करने के लिए मुझे आवश्यकता हो सकती है। फिर मैं उस विनिर्देश का कार्यान्वयन करता हूं, एनएच का उपयोग रीढ़ की हड्डी के रूप में करते हुए, जो भी तकनीक सबसे उपयुक्त है (एक एचक्यूएल कथन, कच्चा एसक्यूएल, मानदंड, क्वेरीओवर ... जो भी हो) का उपयोग करके विनिर्देश को पूरा करता है।
मेरा मतलब यह है कि मेरा क्या मतलब है इसका एक कच्चा उदाहरण है। ध्यान दें कि मैं एक मनमाने ढंग से ICommandProvider
का उपयोग करता हूं, जो कुछ ऑब्जेक्ट है जो आवश्यकतानुसार कमांड के नए उदाहरण बनाता है (यदि आपको एक ऑपरेशन में कई कमांड जारी करने की आवश्यकता है)। मैं अपने आदेशों को एक आईओसी के साथ पंजीकृत करूंगा और प्रदाता उदाहरणों को बनाने के लिए प्रदाता के साथ काम करूँगा। एक नियंत्रक में
public interface ICommand
{
}
public interface ICommandProvider
{
TCommand Create<TCommand>()
where TCommand : ICommand;
}
public interface IQuery<TResult> : ICommand
{
TResult Execute();
}
public class NhCommand : ICommand
{
// plumbing stuff here, like finding the current session
}
public class DelinquentAccountViewModel
{
public string AccountName { get; set; }
public decimal Amount { get; set; }
}
public interface IDelinquentAccountsQuery : IQuery<IEnumerable<DelinquentAccountViewModel>>
{
void AmountGreaterThan(decimal amount);
// you could define members for specifying sorting, etc. here
}
public class DelinquentAccountsQuery : NhCommand
{
public IEnumerable<DelinquentAccountViewModel> Execute()
{
// build HQL and execute results, resulting in a list of DelinquentAccountViewModels
// using _amountGreaterThan as a parameter
return null;
}
private Decimal _amountGreaterThan;
public void AmountGreaterThan(Decimal amount)
{
_amountGreaterThan = amount;
}
}
प्रयोग कुछ इस तरह हो सकता है:
public class DelinquentAccountsController : Controller
{
protected ICommandProvider CommandProvider { get; private set; }
public DelinquentAccountsController(ICommandProvider commandProvider)
{
CommandProvider = commandProvider;
}
public ActionResult Index(decimal amount)
{
var query = CommandProvider.Create<IDelinquentAccountsQuery>();
query.AmountGreaterThan(amount);
return View(query.Execute());
}
}
कुछ भी नहीं कहते हैं तो आप अपने डेटा का उपयोग के सभी एक आदेश/क्वेरी का उपयोग नहीं कर सकते, लेकिन इसे और अधिक काम है की तुलना में मैं की जरूरत है। मुझे लगता है कि मानक भंडार दृष्टिकोण (NHBernate के खिलाफ LINQ का उपयोग करके) मेरे अनुप्रयोगों की आवश्यक डेटा पहुंच के 95% या उससे अधिक संभालता है।
धन्यवाद Bronumski , मुझे लगता है कि मैं एक संयुक्त अपमान लेगा: वेब सेवाओं द्वारा जेनेरिक प्रश्नों को संभालने के लिए वेब सेवाओं और अतिरिक्त IQueryable-इंटरफ़ेस द्वारा बुलाए जाने वाले अच्छी तरह से परिभाषित विधियां। – mbue