वर्तमान में हमने काम पर एक भंडार पैटर्न लागू किया है। हमारे सभी भंडार अपने स्वयं के इंटरफेस के पीछे बैठते हैं और निनजेक्ट के माध्यम से मैप किए जाते हैं। हमारी परियोजना काफी बड़ी है और इस पैटर्न के साथ कुछ कर्कश हैं जिन्हें मैं हल करने की कोशिश कर रहा हूं।हमारे भंडार पैटर्न को सरल बनाने की कोशिश
सबसे पहले, कुछ नियंत्रक हैं जहां हमें एक ही नियंत्रक में 10 से 15 रिपॉजिटरीज़ की आवश्यकता होती है। इतने सारे भंडारों के लिए पूछते समय कन्स्ट्रक्टर बदसूरत हो जाता है। एकाधिक रिक्तियों को कई रिपॉजिटरीज़ पर कॉल करने के बाद खुद को प्रकट करता है। एकाधिक भंडारों के साथ काम करने के बाद हमें SaveChanges विधि को कॉल करने की आवश्यकता है, लेकिन हमें इसे किस भंडार पर कॉल करना चाहिए? प्रत्येक भंडार में एक है। सभी रिपॉजिटरीज में एंटिटी फ्रेमवर्क डेटा संदर्भ इंजेक्शन का एक ही उदाहरण होता है, इसलिए काम पर कॉल को बचाने के लिए किसी भी यादृच्छिक भंडार को चुनना। यह बस इतना गन्दा लगता है।
मैंने "यूनिट ऑफ वर्क" पैटर्न देखा और एक समाधान के साथ आया जो मुझे लगता है कि दोनों समस्याएं हल करती हैं, लेकिन मुझे इस समाधान में 100% आत्मविश्वास नहीं है, इसलिए किसी भी प्रतिक्रिया की सराहना की जाती है। मैंने DataBucket
नामक एक कक्षा बनाई (ज्यादातर क्योंकि मुझे इसे UnitOfWork
पर कॉल करना पसंद नहीं है। यह मजाकिया लगता है।)।
// Slimmed down for readability
public class DataBucket
{
private DataContext _dataContext;
public IReportsRepository ReportRepository { get; set; }
public IEmployeeRepository EmployeeRepository { get; set; }
public IDashboardRepository DashboardRepository { get; set; }
public DataBucket(DataContext dataContext,
IReportsRepository reportsRepository,
IEmployeeRepository employeeRepository,
IDashboardRepository dashboardRepository)
{
_dataContext = dataContext;
this.ReportRepository = reportsRepository;
this.EmployeeRepository = employeeRepository;
this.DashboardRepository = dashboardRepository;
}
public void SaveChanges()
{
_dataContext.SaveChanges();
}
}
यह दोनों मुद्दों को हल करने के लिए प्रतीत होता है। डेटा बाल्टी पर केवल एक ही SaveChanges
विधि है और आप केवल एक ऑब्जेक्ट, डेटा बाल्टी इंजेक्ट करते हैं। फिर आप सभी रिपॉजिटरीज को गुणों के रूप में एक्सेस करते हैं। डेटा बाल्टी थोड़ा गन्दा लग रहा है क्योंकि यह अपने कन्स्ट्रक्टर में हमारे भंडारों के सभी (आसानी से 50 या अधिक) को स्वीकार करेगा।
एक नया भंडार जोड़ने की प्रक्रिया में अब शामिल होगा: इंटरफ़ेस बनाना, भंडार बनाना, इंटरफ़ेस को मैप करना और निनजेक्ट में भंडार, और डेटा बाल्टी में एक संपत्ति जोड़ना और इसे पॉप्युलेट करना।
मैंने इस विकल्प के बारे में सोचा जो ऊपर से एक कदम को खत्म कर देगा।
public class DataBucket
{
private DataContext _dataContext;
public IReportsRepository ReportRepository { get; set; }
public IEmployeeRepository EmployeeRepository { get; set; }
public IDashboardRepository DashboardRepository { get; set; }
public DataBucket(DataContext dataContext)
{
_dataContext = dataContext;
this.ReportRepository = new ReportsRepository(dataContext);
this.EmployeeRepository = new EmployeeRepository(dataContext);
this.DashboardRepository = new DashboardRepository(dataContext);
}
public void SaveChanges()
{
_dataContext.SaveChanges();
}
}
यह एक काफी Ninject में सभी भंडार मैपिंग क्योंकि वे सभी डेटा बाल्टी में instantiated कर रहे हैं दूर करता है। तो अब एक नया भंडार जोड़ने के लिए कदमों में शामिल हैं: इंटरफ़ेस बनाएं, भंडार बनाएं, डेटा बाल्टी में संपत्ति जोड़ें और तत्काल करें।
क्या आप इस मॉडल के साथ कोई दोष देख सकते हैं? सतह पर यह हमारे भंडारों को इस तरह से उपभोग करने के लिए और अधिक सुविधाजनक लगता है। क्या यह एक समस्या है जिसे पहले संबोधित किया गया है? यदि हां, तो इस मुद्दे के लिए सबसे आम और/या सबसे प्रभावी दृष्टिकोण क्या है?
धन्यवाद :)
क्या आपको आईडीटाबकेट इंटरफ़ेस की आवश्यकता नहीं है क्योंकि यह कक्षा रिपोजिटरी-क्लासेस का उपयोग करती है, इसलिए इस कक्षा को भी इंजेक्शन दिया जाता है? वह तरफ, मेरे लिए एक अच्छा समाधान की तरह लगता है। मुझे लगता है कि भंडार-गुणों को निजी सेटर बनाना बेहतर होगा। – Maarten
आप निनजेक्ट के साथ ठोस कक्षाओं को इंजेक्ट कर सकते हैं। यदि आप कोई मैपिंग प्रदान नहीं करते हैं तो निनजेक्ट अनुरोध किए गए नाम के साथ एक कक्षा की तलाश करेगा और यदि संभव हो तो इसे तुरंत चालू करें। – Chev
यूनिट उद्देश्यों के लिए हालांकि @ मार्टन आप शायद सही हैं। मुझे इसे इंटरफ़ेस करना होगा ताकि मैं परीक्षण के लिए इसे नकल कर सकूं। – Chev