8

मैं रिपॉजिटरीज़ के साथ थोड़ा सा संघर्ष कर रहा हूं। मैं सी # और एनएचबेर्नेट का उपयोग कर रहा हूं। मेरे पास सवाल यह है कि: मेरे भंडार को सहेजने या प्राप्त करने से पहले कितना करना चाहिए?रिपोजिटरी पैटर्न का उपयोग करते समय मुझे अपने भंडार विधियों को कितना तर्क देना चाहिए?

उदाहरण के लिए मेरे पास एक उपयोगकर्ता वर्ग है जो एक समग्र रूट है। मैं "रजिस्टर" नामक एक विधि को कॉल करना चाहता हूं जो उपयोगकर्ता को जोड़ देगा और व्यवसाय नियमों के आधार पर कुछ डिफ़ॉल्ट मान सेट करेगा और कुछ अन्य संस्थाएं बनाएगा जो "उपयोगकर्ता" रूट (यानी पता, समूह, आदि) के उप-भाग भी हैं। मैं बुलाना चाहिए

userRepo.Register(newUser); 

जो (स्पष्ट मुद्दों की अनदेखी कर) होगा:

Regsiter(User newUser){ 
newUser.SomeProp = "Default Data"; 
Group g= new Group; 
g.SomeProp2 = "Default Data"; 
newUser.Groups.Add(g); 
Session.Save(g); 
Session.Save(newUser); 
} 

या मैं एक व्यापार परत में रजिस्टर करने चाहिए थे और यह कार्य करें:

Regsiter(User newUser){ 
newUser.SomeProp = "Default Data"; 
Group g= new Group; 
g.SomeProp2 = "Default Data"; 
newUser.Groups.Add(g); 
userRepo.Register(newUser, g);// this does session.save on both objects. 
} 

दोनों थोड़ा गलत लगता है।

सही दृष्टिकोण क्या है?

संपादित ------------------------------- सभी प्रतिक्रियाओं के लिए

धन्यवाद। मैं यह तय नहीं कर सकता कि कौन सबसे सही है और इसलिए स्वीकार करने का उत्तर कौन सा है।

आम तौर पर हर कोई कह रहा है कि व्यवसाय नियम किसी अन्य परत में डाल दें। यह समझ में आता है लेकिन मैं समूहों के लिए डेटा कॉल के बारे में अनिश्चित हूं - चूंकि समूह एक समग्र रूट नहीं हैं, उनके पास अपनी खुद की भंडार नहीं होनी चाहिए, इसलिए मैं उन्हें जोड़ने और सहेजने के बारे में कैसे जा सकता हूं? मेरे प्रोजेक्ट में उपयोगकर्ता के समूह संग्रह में एक समूह जोड़ना स्वचालित रूप से डीबी में समूह नहीं बनाता है; मुझे ऑब्जेक्ट पर session.save को कॉल करने की भी आवश्यकता है। तो क्या मैं इसे उपयोगकर्ता रेपो में userRepo.SaveGroup (g) के रूप में डालूं?

यदि मेरे पास अन्य परत में createGroup() है तो इसे या तो अपने स्वयं के रेपो या उपयोगकर्ताओं का उपयोग करने की आवश्यकता होगी। या मैं मोटी हो रहा हूँ?

उत्तर

3

निर्धारित है जहाँ आप अपने रजिस्टर विधि चाहते हैं, शायद एक UserServices कक्षा में। आप एक UserFactory को ऑब्जेक्ट निर्माण प्रतिनिधि कर सकते हैं। एक CreateNewUser में () विधि, उपयोगकर्ता और समूह संग्रह के लिए अपने डिफ़ॉल्ट सेट अप करें। फिर डेटा को जारी रखने के लिए UserRepository.Save (newUser) को कॉल करें।

// UserServices class 
public void Register(User newUser) 
{ 
    // add custom registration stuff. 
    _userRepository.Save(newUser); 
} 

// Application code 
User user = UserFactory.CreateNewUser(); 
_userServices.Register(user); 

// UserFactory 
public User CreateNewUser() 
{ 
    // all new user, group creation 
} 
+0

समूह निर्माण उपयोगकर्ता सामग्री में है। समूह निर्माण डीबी बातचीत कहाँ होती है? एक समूह रेपो या उपयोगकर्ता repo में? –

+0

यह निर्भर करता है। समूह रिपोजिटरी के लिए एक मामला हो सकता है। अभ्यास में, प्रति योग एक प्रति को रिपॉजिटरीज़ को सीमित करने का प्रयास करें। ऐसे मामले में, मौजूदा समूह को खोजने के लिए समूह रिपॉजिटरी का उपयोग करें और समूह को अपने UserFactory.CreateNewUser विधि में पैरामीटर के रूप में पास करें। जब UserRepository उपयोगकर्ता को सहेजता है, तो यह सुनिश्चित करने के लिए कि आप समूह एसोसिएशन को भी सहेज रहे हैं, अपनी कॉन्फ़िगरेशन जांचें। –

+1

वैकल्पिक रूप से, यह एक नई उपयोगकर्ता ऑब्जेक्ट को तुरंत चालू करने के लिए और अधिक समझ सकता है और निम्न कार्यान्वयन के साथ UserServices.RegisterWithDefaultGroup (उपयोगकर्ता उपयोगकर्ता) विधि है: समूह डिफ़ॉल्ट समूह = _groupRepository.FindByName ("डिफ़ॉल्ट"); user.AddGroup (defaultGroup); रजिस्टर (उपयोगकर्ता); यह वास्तव में आपके आवेदन, सॉफ़्टवेयर आर्किटेक्चर पर निर्भर करता है, और आप कितने सख्त कुछ सिद्धांतों का पालन करना चाहते हैं। सौभाग्य! –

6

व्यक्तिगत रूप से, मैं रिपोजिटरी पैटर्न को स्पॉक्स के लिए एक विकल्प के रूप में रखता हूं। तो मेरी भंडार की तरह getById(int id), save(), add(DomainObject obj) आदि

एक व्यवसाय स्तरीय में तरीकों के लिए होता है, मैं userManager.registerUser (स्ट्रिंग उपयोगकर्ता नाम,/* पैरामीटर, आदि * /) होगा। यह डोमेन ऑब्जेक्ट बना देगा। यह विधि केवल डेटा स्तरीय में add() विधि को कॉल करेगी।

संक्षेप में, व्यवसाय स्तर व्यवसाय-वाई है, और डेटा स्तर डेटा-वाई है।

+0

आपके विधि नामों के आधार पर, मैं वास्तव में कहूंगा कि आपके "भंडार" वास्तव में अनुसरण करते हैं Fowlers PofEAA पुस्तक से "डेटा मैपर" पैटर्न। डोमेन संचालित डिजाइन से एक रिपोजिटरी विशिष्ट विधियों वाले वर्ग की बजाय संग्रह-जैसे इंटरफ़ेस है। – jrista

3

पहले स्थान पर रिपोजिटरी पैटर्न का उपयोग करने के लिए आपकी प्रेरणा क्या है? आमतौर पर, भंडार आपके ऑब्जेक्ट दृढ़ता तर्क का अमूर्त है। यह (आमतौर पर) डेटाबेस से वस्तुओं को पुनर्प्राप्त करता है और अपडेट, आवेषण और हटाना भी संभालता है।

यदि आप कुछ तर्क जांचने के लिए एक परीक्षा लिख ​​रहे थे और डेटाबेस को हिट नहीं करना चाहते थे तो आपको किस वस्तु का मज़ाक उड़ाया जाएगा? आमतौर पर भंडार।

परिदृश्य में ए) आप परीक्षण नहीं कर सकते हैं कि किसी नए उपयोगकर्ता को डिफ़ॉल्ट डिफ़ॉल्ट डेटा के साथ सीधे डेटाबेस को मारने के बिना बनाया गया है।इस वजह से, मैं रिपोजिटरी के बाहर सभी व्यावसायिक तर्क रखने का समर्थन करता हूं और आपके दूसरे डिजाइन

+0

एक भंडार अद्यतन को संभाल नहीं लेना चाहिए। यह इंटरफेस जैसे संग्रह में अमूर्त डेटाबेस (या अन्य दृढ़ता) डेटाकैस होना चाहिए। सूची या शब्दकोश जैसे सामान्य डॉटनेट संग्रह को अपडेट के बारे में जानने की आवश्यकता नहीं है। न तो एक भंडार करता है। इस उदाहरण में – Paco

0

में दो संभावित "गलतता" मुद्दों को देखता हूं (क्योंकि आपने वास्तव में यह नहीं बताया था कि आपने उनके साथ क्या गलत सोचा था)।

  1. समस्या को हल उपयोगकर्ता पंजीकरण विधि में समूह की बचत, या समूह के तरीकों में उपयोगकर्ता बचत घूमती है, तो आप इन अलग अलग तरीकों में बांट देना चाहिए। (यानि रजिस्टर() रजिस्टर समूह() या गेट ग्रुप()

  2. यदि समस्या वास्तव में चीजों को बचाने के लिए तैयार होने से पहले समस्या को हल करने के आसपास घूमती है, तो ट्रैक करें कि वे क्या जोड़ना चाहते हैं और प्रतीक्षा करें कुल मिलाकर "बचाने" विधि भंडारण में इस जानकारी के किसी भी डालने से पहले कहा जाता है।

1

आपके कोड उदाहरण से, मैं रजिस्टर विधि को एक सेवा ऑपरेशन कहूंगा। एक सेवा संचालन के रूप में, यह एक भंडार के बजाय, एक सेवा, या एक व्यापार घटक पर होगा। इवांस (डीडीडी प्रसिद्धि के अनुसार) के अनुसार, एक भंडार आपके डेटाबेस में संग्रहीत इकाइयों के लिए संग्रह-जैसे इंटरफ़ेस है। सामान्य विचार यह है कि आप अपने इकाइयों को एक मूलभूत सीआरयूडी जैसी पहुंच प्रदान करते हैं, जो आपके शेष कोड को ओआरएम उपकरण जैसे निम्न-स्तर डेटा एक्सेस विवरण से दूर कर देता है।

रजिस्टर के साथ अपने उदाहरण के लिए ... आपकी सेवा विधि इनपुट को मान्य करेगी, उपयोगकर्ता ऑब्जेक्ट का निर्माण करेगी, और फिर अपनी रिपॉजिटरी को "रिपोजिटरी" में "नई" जोड़ने के लिए कॉल करें (जो डेटाबेस हो सकता है ... लेकिन कुछ और भी हो सकता है ... जहां तक ​​आपका डोमेन चिंतित है, इससे कोई फर्क नहीं पड़ता ... यह सिर्फ एक भंडार है।)

+0

एक नियंत्रक वर्ग के भीतर या व्यापार परत में सेवा संचालन है? या यह वही बात है जहां तक ​​आप इस मामले में चिंतित हैं? –

+0

ठीक है, मैं नियंत्रकों को सेवाओं से अलग होने पर विचार करता हूं। मानव नियंत्रक के लिए एक नियंत्रक एक पहुंच बिंदु है ...और आम तौर पर, वे जितना संभव हो उतना हल्का वजन होना चाहिए। आपके नियंत्रकों को अन्य सेवाओं के लिए कॉल का न्यूनतम ऑर्केस्ट्रेशन करना चाहिए, किसी भी डेटा को पैकेज करना चाहिए, और उस डेटा को एक दृश्य में निर्देशित करना चाहिए, और कुछ नहीं। एक सेवा एक आवेदन सेवा या एक व्यापार सेवा हो सकती है। आवेदन सेवाएं पूरी तरह से आवेदन स्तर का काम कर सकती हैं, या कई व्यावसायिक सेवाओं को लिख सकती हैं ... लेकिन एक सेवा वह जगह है जहां आपके व्यवहार का बड़ा हिस्सा भंडारों के उपयोग सहित है। – jrista

+1

@ चार्ली भालू: जेफरी पालेर्मो के प्याज वास्तुकला की जांच करें। डीडीडी-शैली ऐप्स के लिए मैं यही उपयोग करता हूं। यह समझाने में मदद कर सकता है कि कहां जाता है। सौभाग्य! http://jeffreypalermo.com/blog/the-onion-architecture-part-1/ –

संबंधित मुद्दे