2012-05-03 10 views
6

मुझे Command Query Separation का विचार पसंद है, लेकिन यह नहीं देख सकता कि एमवीसी कंट्रोलर एक्शन के भीतर इसका उपयोग कैसे किया जा सकता है, और इसे जोड़ने के बाद नई इकाई की आईडी की आवश्यकता है।एमवीसी नियंत्रकों में कमांड-क्वेरी पृथक्करण सिद्धांत का उपयोग

उदाहरण के लिए, एक सेवा सरल उदाहरण में एक नया आइटम बनाने के लिए प्रयोग किया जाता है:

public ActionResult Assign(AssignViewModel viewModel) 
{ 
    var newItem = _AssignItemService.AssignItem(viewModel.ItemName, viewModel.ItemValue); 

    return RedirectToAction("ListItem", new {id = newItem.Id); 
} 

लेकिन जब मैं कार्रवाई जो नए आइटम प्रदर्शित करने के लिए जा रहा है पर पुन: निर्देशित, मुझे पता है की जरूरत है नव निर्मित आइटम की आईडी, ताकि इसे डेटाबेस से पुनर्प्राप्त किया जा सके। तो मुझे नव निर्मित आइटम (या कम से कम, इसकी आईडी) वापस करने के लिए सेवा से पूछना है।

शुद्ध सीक्यूएस में, कमांड के पास कोई वापसी मूल्य नहीं है, इसलिए ऊपर दिया गया पैटर्न अमान्य होगा।

कोई सलाह आभारी रूप से प्राप्त हुई।

उत्तर

4

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

फिर आप कुछ भी करने के लिए उपयोग कर सकते हैं entity.Id आपको बस इतना करना है कि फोन करने वाले नई इकाई (जो सबसे अधिक संभावना कुंजी के रूप में GUIDs का उपयोग कर निकलता है) के लिए आईडी का उल्लेख करने के लिए किया जाएगा चाहते

+0

आप बाद में "आइटम" कैसे प्राप्त करते हैं? –

+0

AssignItem विधि को पारित ऑब्जेक्ट में आईडी लौटने के बाद आईडी जानकारी शामिल होती है। चूंकि विधि एक कमांड है, ऑब्जेक्ट की स्थिति – jorgehmv

+0

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

8

मुझे लगता है कि आप एक pedantic बिंदु पर अटक गए हैं।

एक प्रश्न तब होता है जब आप डेटाबेस को एक प्रश्न पूछना चाहते हैं, जैसे "मिसिसिपी के पश्चिम में कितने ग्राहक जून के महीने के दौरान लाल रंग के सामान खरीदे?" यह एक प्रश्न है। किसी सम्मिलन के दौरान आईडी लौटने पर एक सामान्य क्वेरी नहीं है, प्रति से।

सॉफ्टवेयर विकास में अधिकांश अन्य चीजों के साथ, यह पैटर्न पूर्ण नहीं है। भी फाउलर कहते हैं कि वे इसे तोड़ने के लिए तैयार है जब यह ऐसा करने के लिए सुविधाजनक है:

ढेर पॉपिंग एक आपरिवर्तक है कि राज्य को संशोधित करता है का एक अच्छा उदाहरण है। मेयर सही ढंग से कहता है कि आप इस विधि से बच सकते हैं, लेकिन यह एक उपयोगी मुहावरे है। इसलिए जब मैं कर सकता हूं, तो मैं इस सिद्धांत का पालन करना पसंद करता हूं, लेकिन मैं अपने पॉप को पाने के लिए इसे तोड़ने के लिए तैयार हूं।

यदि आप वास्तव में अपने प्रविष्टि से अलग डेटाबेस से सबसे हाल ही में जोड़े गए आईडी को पुनर्प्राप्त करना चाहते हैं, तो आप Scope Identity जैसे कुछ का उपयोग कर सकते हैं। लेकिन मुझे लगता है कि आप कोई अतिरिक्त लाभ के लिए जटिलता जोड़ रहे हैं।

+0

इसके अलावा, सुनिश्चित करें कि यदि आप स्कोप पहचान का उपयोग करते हैं या इसी तरह आप बहु-थ्रेडेड स्थितियों को सही तरीके से संभालते हैं। जैसे 'टी 1' आवेषण,' टी 2 'आवेषण, 'टी 1' को 'टी 2' डालने से 'आईडी' प्राप्त होता है, 'टी 2' एक ही आईडी प्राप्त करता है। बेशक, एक ही समस्या किसी भी परमाणु संचालन/लेनदेन पर लागू होती है, इसलिए मुझे यकीन है कि आपने इसे माना है। – Basic

+0

डाटाबेस को केवल सम्मिलित फ़ंक्शन के रिटर्न मान के माध्यम से आपको आईडी देने का एक और अच्छा कारण है। –

+0

मुझे लगता है कि फाउलर की टिप्पणी इस बात पर ध्यान देती है कि एक स्टैक में पॉप विधि ठीक है क्योंकि इसका उपयोग सामान्य है, इसलिए यह सभी डेवलपर्स के लिए एक मुहावरे बन गया है, लेकिन मुझे नहीं लगता कि एक सहेजने वाली विधि से आईडी को वापस करना एक मुहावरे है। मैं आपसे सहमत हूं कि कुछ भी पूर्ण नहीं है और थोड़ी देर में इस तरह के नियमों को तोड़ने का कोई बड़ा सौदा नहीं है – jorgehmv

0

रास्ता।

हालांकि, मेरे अनुभव में, (शुद्धवादी) नियम लगाते हुए कि एक आदेश एक परिणाम वापस नहीं कर सकता है, जिससे कम लाभ के लिए समस्याएं पैदा हो रही हैं।

+0

धन्यवाद erikkallen। समझ में आता है, लेकिन अंत में मुझे लगता है कि jorgehmv का विचार मेरे लिए बेहतर काम करेगा। – Appetere

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